Android 导航抽屉带视图寻呼机,导致碎片重叠
我在活动中有导航抽屉和查看寻呼机。 问题在于屏幕重叠。当我点击导航抽屉中的另一个项目时,它会切换到相应的屏幕,但视图寻呼机保持不变。在视图分页器getItem()中,我将使用fragment.newInstance(int index)调用一个片段。我尝试在视图页面中更改getItem()方法,以使用与nav抽屉相同的代码并替换当前片段,但是这会给我“java.lang.IllegalStateException:无法更改片段的容器ID”。我试图通过删除片段并提交更改来删除项目的ID。它没有修复错误。 如有任何建议或帮助,将不胜感激Android 导航抽屉带视图寻呼机,导致碎片重叠,android,android-fragments,android-viewpager,navigation-drawer,Android,Android Fragments,Android Viewpager,Navigation Drawer,我在活动中有导航抽屉和查看寻呼机。 问题在于屏幕重叠。当我点击导航抽屉中的另一个项目时,它会切换到相应的屏幕,但视图寻呼机保持不变。在视图分页器getItem()中,我将使用fragment.newInstance(int index)调用一个片段。我尝试在视图页面中更改getItem()方法,以使用与nav抽屉相同的代码并替换当前片段,但是这会给我“java.lang.IllegalStateException:无法更改片段的容器ID”。我试图通过删除片段并提交更改来删除项目的ID。它没有修复
public class MainActivity extends FragmentActivity {
private String[] titles;
private ListView drawerList;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle drawerToggle;
private int currentPosition = 0;
private ShareActionProvider shareActionProvider;`
MyPagerAdapter myPagerAdapter;
ViewPager pager;
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//code to run when the item gets clicked
selectItem(position);
}
}
;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
titles = getResources().getStringArray(R.array.options);
drawerList = (ListView) findViewById(R.id.drawer);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
myPagerAdapter = new MyPagerAdapter(this.getSupportFragmentManager());
//find view pager
pager = (ViewPager) findViewById(R.id.viewPager);
//set view pager adapter
pager.setAdapter(myPagerAdapter);
//item user clicks on is highlighted
//with simple_list_item_activated_1
drawerList.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_activated_1, titles));
drawerList.setOnItemClickListener(new DrawerItemClickListener());
//if mainactivity is newly created,
//use selectItem() to display HomeFragment
if (savedInstanceState != null) {
currentPosition = savedInstanceState.getInt("position");
setActionBarTitle(currentPosition);
} else {
selectItem(0);
}
//create the actionbarToggle
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
R.string.open_drawer, R.string.close_drawer) {
//called when a drawer has settleed in a completely closed state
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
invalidateOptionsMenu();
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
FragmentManager fragMan = getSupportFragmentManager();
Fragment fragment = fragMan.findFragmentById(R.id.content_frame);
if (fragment instanceof HomeFragment) {
currentPosition = 0;
}
if (fragment instanceof EducationFragment) {
currentPosition = 1;
}
if (fragment instanceof TechnicalSkillsFragment) {
currentPosition = 2;
}
if (fragment instanceof WorkExpFragment) {
currentPosition = 3;
}
setActionBarTitle(currentPosition);
drawerList.setItemChecked(currentPosition, true);
}
}
);
}
private Fragment selectItem(int position) {
//currentPosition for savedInstanceState
currentPosition = position;
Fragment fragment = null;
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = fragmentManager.beginTransaction();
if(fragment !=null){
ft.remove(fragment).commit();
fragmentManager.executePendingTransactions();
}
switch (position) {
case 1:
fragment = new EducationFragment();
break;
case 2:
fragment = new TechnicalSkillsFragment();
break;
case 3:
fragment = new WorkExpFragment();
break;
default:
fragment = new HomeFragment();
break;
}
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack(null);
ft.commit();
//set title and close the drawer
if (drawerLayout.isDrawerOpen(drawerList)) {
setActionBarTitle(position);
drawerLayout.closeDrawer(drawerList);
}
return fragment;
}
public class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
return selectItem(position);
}
@Override
public int getCount() {
return 4;
}
public类MainActivity扩展了FragmentActivity{
私有字符串[]标题;
私有列表视图抽屉列表;
私人抽屉布局;
私人诉讼律师事务所;
私有int currentPosition=0;
私有ShareActionProvider ShareActionProvider`
MyPagerAdapter MyPagerAdapter;
查看寻呼机;
私有类DrawerItemClickListener实现ListView.OnItemClickListener{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//单击项目时要运行的代码
选择项目(位置);
}
}
;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
titles=getResources().getStringArray(R.array.options);
抽屉列表=(列表视图)findViewById(R.id.drawer);
抽屉布局=(抽屉布局)findViewById(R.id.抽屉布局);
myPagerAdapter=新的myPagerAdapter(this.getSupportFragmentManager());
//查找视图寻呼机
pager=(ViewPager)findViewById(R.id.ViewPager);
//设置视图寻呼机适配器
寻呼机设置适配器(myPagerAdapter);
//用户单击的项目将突出显示
//简单列表项激活时1
抽屉列表setAdapter(新阵列适配器)(此,
android.R.layout.simple_list_item_activated_1,titles));
setOnItemClickListener(新的DroperItemClickListener());
//如果mainactivity是新创建的,
//使用selectItem()显示HomeFragment
如果(savedInstanceState!=null){
currentPosition=savedInstanceState.getInt(“位置”);
setActionBarTitle(当前位置);
}否则{
选择项目(0);
}
//创建actionbarToggle
抽屉切换=新操作BarDrawerToggle(此为抽屉布局,
R.string.打开抽屉,R.string.关闭抽屉){
//当抽屉处于完全关闭状态时调用
@凌驾
打开图纸上的公共空白(视图抽屉视图){
super.onDrawerOpened(抽屉视图);
无效操作菜单();
}
@凌驾
图纸上的公共空白已关闭(视图抽屉视图){
super.onDrawerClosed(抽屉视图);
无效操作菜单();
}
};
抽屉布局。设置抽屉链接器(抽屉切换);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
getSupportFragmentManager().AddOnBackbackChangedListener(
新建FragmentManager.onBackbackChangedListener(){
@凌驾
BackbackChanged()上的公共无效{
FragmentManager fragMan=getSupportFragmentManager();
Fragment fragMan.findFragmentById(R.id.content\u frame);
if(HomeFragment的片段实例){
currentPosition=0;
}
if(EducationFragment的片段实例){
当前位置=1;
}
if(TechnicalSkillsFragment的片段实例){
当前位置=2;
}
if(WorkExpFragment的片段实例){
当前位置=3;
}
setActionBarTitle(当前位置);
抽屉列表setItemChecked(currentPosition,true);
}
}
);
}
私有片段selectItem(int位置){
//savedInstanceState的当前位置
当前位置=位置;
片段=空;
android.support.v4.app.FragmentManager FragmentManager=getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft=fragmentManager.beginTransaction();
if(片段!=null){
ft.remove(fragment.commit();
fragmentManager.executePendingTransactions();
}
开关(位置){
案例1:
fragment=新的EducationFragment();
打破
案例2:
fragment=新技术killsFragment();
打破
案例3:
fragment=新的WorkExpFragment();
打破
违约:
fragment=新的HomeFragment();
打破
}
ft.replace(R.id.content\u frame,fragment);
ft.addToBackStack(空);
ft.commit();
//设置标题并关闭抽屉
if(抽屉布局isDrawerOpen(抽屉列表)){
setActionBarTitle(位置);
抽屉布局。封闭抽屉(抽屉列表);
}
返回片段;
}
公共类MyPagerAdapter扩展了FragmentPagerAdapter{
公共MyPagerAdapter(碎片管理器fm){
超级(fm);
}
@凌驾
public android.support.v4.app.Fragment getItem(int位置){
返回选择项(位置);
}
@凌驾
public int getCount(){
返回4;
}
AFragmentTransaction
仅处理Fragment
s及其View
s。您的ViewPager
显然是在MainActivity
的布局中定义的,因此它不会被事务替换。一个选项是将ViewPager
放在您加载的Fragment
中