Android的导航平局重新加载片段,只要关闭 [英] Android Navigation draw re-loading fragment whenever closed

查看:299
本文介绍了Android的导航平局重新加载片段,只要关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图把所有我的code从活动片段,以便使用导航抽屉,eventualy一些滑动标签。

目前我有打开并显示一个列表中的半工作抽屉式导航栏。但我是新来的碎片,很困惑,因为它似乎重新载入我的第一个片段,每次我关闭抽屉式导航栏,不选择任何内容。

MainDrawer.java:

 包com.beerportfolio.beerportfoliopro;进口android.support.v4.app.Fragment;
进口android.os.Bundle;
进口android.support.v4.app.FragmentActivity;
进口android.support.v4.app.FragmentTransaction;
进口android.support.v4.widget.DrawerLayout;
进口android.view.View;
进口android.widget.AdapterView;
进口android.widget.ArrayAdapter;
进口android.widget.ListView;/ **
 *创建者麦克在14年1月3日。
 * /
公共类MainDraw扩展FragmentActivity {
    最终的String []数据= {统计,二,三化};
    最终的String [] =片段{
            com.beerportfolio.beerportfoliopro.StatisticsPage
            com.beerportfolio.beerportfoliopro.FragmentTwo
            com.beerportfolio.beerportfoliopro.FragmentThree};
    @覆盖    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.fragment_main);        // TODO:负荷统计片段        ArrayAdapter<串GT;适配器=新ArrayAdapter<串GT;(getActionBar()getThemedContext(),android.R.layout.simple_list_item_1,数据);        最后DrawerLayout抽屉=(DrawerLayout)findViewById(R.id.drawer_layout);
        最终的ListView navList =(ListView控件)findViewById(R.id.drawer);
        navList.setAdapter(适配器);        navList.setOnItemClickListener(新AdapterView.OnItemClickListener(){            @覆盖
            公共无效onItemClick(适配器视图<>母公司,观景,最终诠释POS,长I​​D){
                drawer.setDrawerListener(新DrawerLayout.SimpleDrawerListener(){
                    @覆盖
                    公共无效onDrawerClosed(查看drawerView){
                        super.onDrawerClosed(drawerView);
                        FragmentTransaction TX = getSupportFragmentManager()调用BeginTransaction()。
                        tx.replace(R.id.main,Fragment.instantiate(MainDraw.this,碎片[POS]));
                        tx.commit();
                    }
                });
                drawer.closeDrawer(navList);
            }
        });        FragmentTransaction TX = getSupportFragmentManager()调用BeginTransaction()。
        tx.replace(R.id.main,Fragment.instantiate(MainDraw.this,片段[0]));
        tx.commit();    }
}

StatisticsPage.java:

 包com.beerportfolio.beerportfoliopro;进口android.app.ActionBar;
进口android.content.Shared preferences;
。进口的Andr​​oid preference preferenceManager。
进口android.support.v4.app.Fragment;
进口android.os.Bundle;
进口android.support.v4.app.FragmentActivity;
进口android.support.v4.app.FragmentTransaction;
进口android.support.v4.widget.DrawerLayout;
进口android.util.Log;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.AdapterView;
进口android.widget.ArrayAdapter;
进口android.widget.ListView;/ **
 *创建者麦克在14年1月3日。
 * /
公共类StatisticsPage扩展片段{    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                             捆绑savedInstanceState){        共享preferences preFS = preferenceManager.getDefaultShared preferences(getActivity());
        字符串username = prefs.getString(username的,NULL);
        字符串userid = prefs.getString(用户ID,NULL);
        字符串URL =htt​​p://www.beerportfolio.com/app_getStatistics.php?
        字符串userURLComp =U =+用户ID;
        URL = URL + userURLComp;        Log.d(basicStats,URL);
        新getBasicStats(getActivity())执行(URL);
        //充气的布局该片段
        返回inflater.inflate(R.layout.statistics_pagelayout,集装箱,FALSE);    }}


解决方案

的问题是您的DrawerListener在您的OnClickListener时设置它不应该是:

  @覆盖公共无效onItemClick(适配器视图<>母公司,观景,最终诠释POS,长I​​D){
    drawer.setDrawerListener(
        新DrawerLayout.SimpleDrawerListener(){
            @覆盖公共无效onDrawerClosed(查看drawerView){...}
        }
    );
 }

POS的范围整数是这样的,每一个抽屉关闭时,onDrawerClose认为 pos的值没有改变。由于没有条件检查的项目被点击,那么相同的片段是每次抽屉关闭(除非你点击一个不同的项目)创建。

设置成员布尔真被点击项目时,并设置一个成员的int其位置。使用布尔项目点击抽屉接近区分:

 私人布尔mNavItemClicked = FALSE;
私人INT mNavPosition = 0;
...
@覆盖保护无效的onCreate(捆绑savedInstanceState){
...
    navList.setOnItemClickListener(新ListView.OnItemClickListener {
        @覆盖公共无效onItemClick(适配器视图父母,观景,INT位置,长的id){
            mNavItemClicked = TRUE;
            mNavPosition =位置;
            drawerLayout.closeDrawer(navList);
        }
    });
    ActionBarDrawerToggle drawerToggle =新ActionBarDrawerToggle(...){
        公共无效onDrawerClosed(查看视图){
            如果(mNavItemClicked){
                getSupportFragmentManager()调用BeginTransaction()
                    .replace(R.id.main,Fragment.instantiate(MainDraw.this
                             ,片段[mNavPosition])
                    。承诺();            }
            mNavItemClicked = FALSE;
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);
}

如果您决定使用 ActionBarDrawerToggle 然后遵循其设计原则,并通过调用活动回调方法 onConfigurationChanged onOptionsItemSelected

I am trying to convert all my code from activities to fragments in order to use a navigation drawer and eventualy some sliding tabs.

Currently I have a semi working navigation drawer that opens and displays a list. BUt I am new to fragments and am confused because it seems to reload my first fragment everytime I close the navigation drawer and do not select anything.

MainDrawer.java :

package com.beerportfolio.beerportfoliopro;

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

/**
 * Created by Mike on 1/3/14.
 */
public class MainDraw extends FragmentActivity {
    final String[] data ={"Statistics","two","three"};
    final String[] fragments ={
            "com.beerportfolio.beerportfoliopro.StatisticsPage",
            "com.beerportfolio.beerportfoliopro.FragmentTwo",
            "com.beerportfolio.beerportfoliopro.FragmentThree"};
    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);

        //todo: load statistics fragment

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActionBar().getThemedContext(), android.R.layout.simple_list_item_1, data);

        final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);


        final ListView navList = (ListView) findViewById(R.id.drawer);
        navList.setAdapter(adapter);

        navList.setOnItemClickListener(new AdapterView.OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){
                drawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener(){
                    @Override
                    public void onDrawerClosed(View drawerView){
                        super.onDrawerClosed(drawerView);
                        FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
                        tx.replace(R.id.main, Fragment.instantiate(MainDraw.this, fragments[pos]));
                        tx.commit();
                    }
                });
                drawer.closeDrawer(navList);
            }
        });

        FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
        tx.replace(R.id.main,Fragment.instantiate(MainDraw.this, fragments[0]));
        tx.commit();

    }


}

StatisticsPage.java :

package com.beerportfolio.beerportfoliopro;

import android.app.ActionBar;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

/**
 * Created by Mike on 1/3/14.
 */
public class StatisticsPage extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        String userName = prefs.getString("userName", null);
        String userID = prefs.getString("userID", null);
        String url = "http://www.beerportfolio.com/app_getStatistics.php?";
        String userURLComp = "u=" + userID;


        url = url + userURLComp ;

        Log.d("basicStats", url);


        new getBasicStats(getActivity()).execute(url);
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.statistics_pagelayout, container, false);

    }





}

解决方案

The issue is that your DrawerListener is set in your OnClickListener when it shouldn't be:

@Override public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){
    drawer.setDrawerListener(
        new DrawerLayout.SimpleDrawerListener(){
            @Override public void onDrawerClosed(View drawerView){...}
        }
    );
 }

The scope of your pos integer is such that, every time the drawer closes, onDrawerClose thinks that the value of pos hasn't changed. Since there isn't a condition checking that an item was clicked, then the same Fragment is recreated each time the drawer closes (unless you click on a different item).

Set a member boolean to true when an item is clicked and set a member int to its position. Use the boolean to differentiate between an item click and a drawer close:

private boolean mNavItemClicked = false;
private int mNavPosition = 0;
...
@Override protected void onCreate(Bundle savedInstanceState) {
...
    navList.setOnItemClickListener(new ListView.OnItemClickListener {
        @Override public void onItemClick(AdapterView parent, View view, int position, long id) {
            mNavItemClicked = true;
            mNavPosition = position;
            drawerLayout.closeDrawer(navList);
        }
    });
    ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(...) {
        public void onDrawerClosed(View view) {
            if (mNavItemClicked) {
                getSupportFragmentManager().beginTransaction()
                    .replace(R.id.main, Fragment.instantiate(MainDraw.this
                             , fragments[mNavPosition])
                    .commit();

            }
            mNavItemClicked = false;
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);
}

If you decide to use the ActionBarDrawerToggle then follow its design guidelines and call through to the Activity callback methods onConfigurationChanged and onOptionsItemSelected.

这篇关于Android的导航平局重新加载片段,只要关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆