android - 在 popBackStack() 之后将工具栏更改为抽屉/菜单图标?

标签 android android-fragments android-toolbar

我有一个带有 MainActivity 的 Android 应用程序,它在按下按钮时将内容区域与 fragment 交换。使用当前代码(见下文),它可以成功

  1. 用新 fragment 交换内容区域
  2. 在工具栏中显示“向上导航”(后退按钮)
  3. “向上”/“向后”导航(恢复内容区域之前的状态)

...但是工具栏本身不会更新以显示“抽屉”/“菜单”(汉堡包)按钮,当它返回到其原始状态时(getSupportFragmentManager().getBackStackEntryCount() == 0 )。我想我需要在我的 Activity 中实现 FragmentManager.OnBackStackChangedListener,尽管我的尝试并不那么成功。我也看到了对 syncState() 的提及,尽管我在那里也不太幸运。

如何在交换和弹出 fragment 后将工具栏主页按钮恢复为“抽屉”/“菜单”外观和功能?

我的代码可以在下面找到。在分享之前尝试对其进行一些简化,希望我没有删减任何重要内容。

MainActivity.java:

package me.stashhh.stashboxes;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import me.stashhh.stashboxes.model.CountryManager;


public class MainActivity extends ActionBarActivity {
    private Toolbar toolbar;
    private ActionBarDrawerToggle mDrawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // normal onCreate stuff
        super.onCreate(savedInstanceState);

        // The ContentView that we're referencing
        setContentView(R.layout.activity_main);

        // Toolbar setup
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);
        }

        // Drawer setup
        DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
        mDrawerToggle = new ActionBarDrawerToggle(
                this,
                mDrawerLayout,
                toolbar,
                R.string.action_drawer_open,
                R.string.action_drawer_close
        );
        mDrawerLayout.setDrawerListener(mDrawerToggle); // REQUIRED FOR ARROW ANIMATION. Fml.
        mDrawerToggle.syncState();


        // Listen for changes in the back stack
        getSupportFragmentManager().addOnBackStackChangedListener(this);
    }

    public void onBackPressed() {
        // Catch back action and pops from backstack
        // (if you called previously to addToBackStack() in your transaction)
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            getSupportFragmentManager().popBackStack();
        } else {
            // Default action on back pressed
            super.onBackPressed();
        }
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        // Get item selected and deal with it
        switch (item.getItemId()) {
            case android.R.id.home:
                //called when "up" (back button) is called in toolbar
                onBackPressed();
                return true;
        }
        return true; // default return since 'boolean'; not sure if proper?
    }



    /**
     * Called when the user clicks the "View Stashboxes" button
     */
    public void viewStashboxes(View view) {
        // update the main content by replacing fragments
        Fragment stashboxesFragment = new StashboxesFragment();

        Bundle args = new Bundle();
        args.putString(StashboxesFragment.ARG_TEST_STRING, "Testing 1.. 2.. 3..");
        stashboxesFragment.setArguments(args);

        FragmentManager fragmentManager = getSupportFragmentManager();

        // Add this transaction to the back stack...
        // http://developer.android.com/training/implementing-navigation/temporal.html#back-fragments
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.content_frame, stashboxesFragment, "stashboxesFragment");
        fragmentTransaction.addToBackStack("stashboxesFragment");
        fragmentTransaction.commit();

        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);

            // If drawer is open, we have to close it...
            DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer); // The drawer layout
            LinearLayout mDrawerList = (LinearLayout) findViewById(R.id.left_drawer); // The drawer "list" itself
            mDrawerLayout.closeDrawer(mDrawerList); // Close the drawer list
        }
    }

    /**
     * Fragment that appears in the "content_frame"
     */
    public static class StashboxesFragment extends Fragment {
        public StashboxesFragment() {
            // empty constructor required for fragment subclasses
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // REDACTED CODE FOR SIMPLICITY.
            // inflate a layout in the main content area.

            return rootView;
        }
    }
}

我是 Android 开发的 super 新手,所以如果您提出任何其他批评,我将不胜感激。谢谢。

最佳答案

这对我有用:请更新您的 onBackPressed()

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub      
    if(frgManager.getBackStackEntryCount()>0){      
           getSupportFragmentManager().popBackStack();      
           // shows the drawer icon when on moving back 
            mDrawerToggle.setDrawerIndicatorEnabled(true);
            drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);
            getSupportActionBar().setDisplayShowHomeEnabled(false);
            getSupportActionBar().setHomeButtonEnabled(false);     
        }else{
            super.onBackPressed();
        }
    mDrawerToggle.syncState();
}

关于android - 在 popBackStack() 之后将工具栏更改为抽屉/菜单图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27134584/

相关文章:

java - 在 ListView 中显示在线目录中的文件 - Android

Android - fragment onCreate() 和 onCreateView() 中的 Bundle savedInstanceState 为空

android - 替换、添加、替换 fragment ,然后导航后退按钮不适用于第一个 fragment

android - Action Bar 和新引入的 Toolbar 有什么区别?

android - 使用 TabLayout 时工具栏消失

android - 如何自动调整 v7.widget.Toolbar 中 setTitle() 文本的大小

java - 想要制作一个 Android 应用程序,当我们输入第一个字母时它会搜索或给出建议

android - 内联 onFocusChange kotlin

android - 在 android 中的单选按钮中停止并播放

android - ViewPager 中的全屏广告