Android 5.0 Toolbar fragment backstack

2015-1-23 15:53:42     人阅读    

 

         我把以前的action bar替换成了  appcompat 库中的 Toolbar,并把Toolbar 设置成了导航抽屉样式
我的问题是,点击back 最小化app取代了通过 backstack. 循环返回,如果我手动添加一个onBackPressed() 监听来处理弹出backstack倒是能解决这个问题 ,但是导航抽屉的选项就会乱了
activity_main.xml

<LinearLayout>
    <android.support.v7.widget.Toolbar/>
    <android.support.v4.widget.DrawerLayout>
        <FrameLayout
             android:id="@+id/container"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>
        <ListView android:id="@+id/navigation_drawer"/>
    </android.support.v4.widget.DrawerLayout>

</LinearLayout>


MainActivity.java

private void setupDrawerAndToolbar() {
 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
 
    setSupportActionBar(toolbar);



    final DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
 
    toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
 
        R.string.app_name, R.string.app_name);
 
    drawerLayout.setDrawerListener(toggle);



    drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 
        @Override
 
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 
            onNavigationDrawerItemSelected(position, true);
 
            drawerLayout.closeDrawer(GravityCompat.START);
 
        }
 
    });
 
    List<NavigationDrawerItem> items = new ArrayList<>();
 
    items.add(...);
 
    drawerList.setAdapter(new NavigationDrawerAdapter(this, items));
 
    drawerList.setItemChecked(selectedIndex, true);
}
}



.
...



private void onNavigationDrawerItemSelected(int position, boolean addToBackStack) {
 
    if (position == selectedIndex) {
 
        return;
 
    }
 
    selectedIndex = position;



    // update the main content by replacing fragments
 
    FragmentManager manager = getFragmentManager();



    Fragment fragment;



    switch (position) {
 
        case ...:
 
            fragment = new Fragment();
 
            break;
 
        default:
 
            throw new IllegalArgumentException("invalid position");
 
    }



    FragmentTransaction transaction =
 
        manager.beginTransaction()
 
               .replace(R.id.container, fragment);



    if (addToBackStack) {
 
        transaction.addToBackStack(fragment.getClass().getName());
 
    }



    transaction.commit();
}
}

处理方法

我想到了一个解决方法:代码

private void onNavigationDrawerItemSelected(int position, boolean addToBackStack) {
 
    if (position == selectedIndex) {
         return;
     }
    // update the main content by replacing fragments
    Fragment fragment;
    switch (position) {
         case ...:
             fragment = new Fragment();
             break;
         default:
             throw new IllegalArgumentException("invalid position");
    }
    FragmentTransaction transaction =
         getFragmentManager().beginTransaction()
                             .replace(R.id.container, fragment, fragment.getClass().getName());
    if (addToBackStack) {
         transaction.addToBackStack(String.valueOf(selectedIndex));
     }
    transaction.commit();
     selectedIndex = position;
}
}
.
...
@Override
public void onBackPressed() {
     int count = getFragmentManager().getBackStackEntryCount();
     if (count > 0) {
         int index = Integer.parseInt(
             getFragmentManager().getBackStackEntryAt(count - 1).getName());
         getFragmentManager().popBackStack();
         selectedIndex = index;
         return;
     }
     super.onBackPressed();
}
}


原文地址:http://www.itmmd.com/201501/542.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

Android 5.0 屏幕截图和分享功能   上一篇
下一篇  修改 Android 5.0 Actionbar 的颜色
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!