Android的导航平局重新加载片段,只要关闭 [英] Android Navigation draw re-loading fragment whenever closed
问题描述
我试图把所有我的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,长ID){
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;
。进口的Android 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 =http://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,长ID){
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屋!