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】:经过几天的分析,我发现问题是我在创建它时使用了内置的导航抽屉活动。内置将任务分成两个。 MainActivity
和 NavigationDrawerFragment
。因此,MainActivity
中的drawerToggle
与NavigationDrawerFragment
中的真实@ 不同。
最初,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 Drawer - 使用 Navigation.findNavController() 导航到多个片段
SlidingMenu 库和 Android Navigation Drawer 有啥区别?