Android Navigation Drawer Show Up Indicator for Lower Level Fragments

Posted

技术标签:

【中文标题】Android Navigation Drawer Show Up Indicator for Lower Level Fragments【英文标题】: 【发布时间】:2014-10-09 19:27:43 【问题描述】:

我在低级片段将导航抽屉功能切换为向上功能时遇到了一些问题。我已阅读this thread 以设法显示向上指标。但是当按下按钮时,它会打开导航抽屉而不是返回到上一个片段。而且我无法将 EditUserFragment 中的操作栏标题设置为“编辑个人资料”。 我正在使用 android Studio 中提供的导航抽屉模板。

我有三个级别:

    MainActivity 带有由 Home 和 Profile 项目组成的导航抽屉 UserFragment 标题为“配置文件”,其中包含一个选项项,会弹出 EditUserFragment EditUserFragment(较低级别的片段)由 UserFragment 触发


主要活动
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
            R.drawable.ic_launcher, R.string.navigation_drawer_open,
            R.string.navigation_drawer_close);


@Override
public void onBackPressed() 
    super.onBackPressed();
    // this won't change the drawer indicator back
    drawerToggle.setDrawerIndicatorEnabled(true);
    // this works
    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);


public void onSectionAttached(int number) 
    // Show the corresponding title on the action bar when clicked and open corresponding
    // fragments.
    Fragment fragment = null;

    switch (number) 
        case 1:
            mTitle = getString(R.string.title_home);
            break;
        case 2:
            mTitle = getString(R.string.title_profile);
            fragment = new UserFragment();
            break;
    

    if (fragment != null) 
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
    


@Override
public boolean onCreateOptionsMenu(Menu menu) 
    if (!mNavigationDrawerFragment.isDrawerOpen()) 
        // Only show items in the action bar relevant to this screen
        // if the drawer is not showing. Otherwise, let the drawer
        // decide what to show in the action bar.
        getMenuInflater().inflate(R.menu.main, menu);
        restoreActionBar();
        return true;
    
    return super.onCreateOptionsMenu(menu);


public void restoreActionBar() 
    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setTitle(mTitle);


public void setActionBarTitle(String title)
    getActionBar().setTitle(title);
    Log.d("Title 2", getActionBar().getTitle().toString());

当我按下手机上的返回按钮(不是操作栏上的向上按钮)时,onBackPressed 正在部分工作(在代码中注释)。


用户片段

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    setHasOptionsMenu(true);

    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_profile, container, false);

    drawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout,
            R.drawable.ic_launcher, R.string.navigation_drawer_open,
            R.string.navigation_drawer_close);

    return view;


@Override
public boolean onOptionsItemSelected(MenuItem item) 
    int id = item.getItemId();
    switch (id) 
        case R.id.action_edit:
            drawerToggle.setDrawerIndicatorEnabled(false);
            // Disable sliding from edge to open drawer
            drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, new EditUserFragment())
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                    .addToBackStack(null)
                    .commit();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    


编辑用户片段

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
    ((MainActivity) getActivity()).setActionBarTitle("Edit Profile");
    Log.d("Title", getActivity().getActionBar().getTitle().toString());


@Override
public boolean onOptionsItemSelected(MenuItem item) 
    // Get item selected and deal with it
    Log.d("KEY: ", String.valueOf(item.getItemId()));
    switch (item.getItemId()) 
        case android.R.id.home:
            Log.d("EditUserFragment", "I'm here");
            getActivity().onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    

getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); 按预期工作,显示的是向上插入符号而不是抽屉;虽然当点击它时,它会打开抽屉而不是回到上一个片段。此外,case android.R.id.home 下的代码永远不会执行。 我尝试将操作栏标题设置为“个人资料”中的“编辑个人资料”。日志显示“编辑配置文件”,但实际运行的应用程序出于某种原因显示“配置文件”。


我想要实现的是能够通过点击向上指示器从 EditUserFragment 返回到 UserFragment(现在向上指示器正在打开导航抽屉)。并在EditUserFragment 中显示正确的标题。

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

经过几天的分析,我发现问题是我在创建它时使用了内置的导航抽屉活动。内置将任务分成两个。 MainActivityNavigationDrawerFragment。因此,MainActivity 中的drawerToggleNavigationDrawerFragment 中的真实@ 不同。

最初,MainActivty 调用NavigationDrawerFragment 来设置导航抽屉所需的所有内容。我通过在我的MainActivity 中实现导航抽屉解决了这个问题,所以我只有一个drawerToggle。不过,如果我在NavigationDrawerFragment 而不是MainActivity 中拥有所有东西(导航抽屉变量),我仍然找不到让它工作的方法。如果有人知道这个问题的答案,请随时发表评论!

【讨论】:

嗨!我在我的应用程序中实现了类似的东西。我有一个带有三个片段的导航抽屉,在其中一个片段上我有一个列表视图,当您单击列表视图上的一个项目时,它会打开第三个片段(下部片段),我现在想显示向上插入符号并禁用导航抽屉。我已经尝试了将近两个星期,但没有成功。我没有使用内置的导航抽屉活动,也没有 navigationDrawerFragment。你能帮我吗? :) @neteot 您需要在MainActivity 中有一个公共函数才能从较低级别的片段重置您的操作栏。在函数中,您将执行以下操作:mDrawerToggle.setDrawerIndicatorEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); 当您想要显示插入符号时,请从您的片段中调用该函数。 谢谢!事实证明,这次我已经实现了 Fragment Navigation Drawer 但仍然没有得到想要的结果。我已经尝试了您的建议,但现在在较低级别的片段上,它既没有出现汉堡包图标也没有出现插入符号图标,而且最糟糕的是(结果我必须实现一个操作菜单选项才能从列表视图的较低级别)它只是弹出堆栈的最后一个片段。但是现在列表视图中也没有出现汉堡图标:/谢谢你的回答我想我必须非常接近解决方案

以上是关于Android Navigation Drawer Show Up Indicator for Lower Level Fragments的主要内容,如果未能解决你的问题,请参考以下文章

Android - Navigation Drawer

Android 开发之Navigation Drawer

Android Drawer - 使用 Navigation.findNavController() 导航到多个片段

SlidingMenu 库和 Android Navigation Drawer 有啥区别?

Android官方终于支持 Navigation Drawer(导航抽屉)模式

如何在 Android 中为 Navigation Drawer 添加一个分区分隔符?