Android导航抽屉在较低级别的片段中显示指示器

11
我有一些问题,需要将导航抽屉功能切换到更低级别的片段。我已经阅读了这个主题以显示向上指示器。但是当按下按钮时,它会打开导航抽屉而不是返回到上一个片段。我无法在EditUserFragment中设置操作栏标题为“编辑个人资料”。
我正在使用Android Studio中提供的导航抽屉模板。
我有三个级别:
1.带有Home和Profile项目的导航抽屉的MainActivity 2.标题为“Profile”的UserFragment,其中包含一个选项,可以弹出EditUserFragment 3.UserFragment触发较低级别的EditUserFragment
MainActivity
@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在我按下手机的返回键时(而不是在操作栏上的向上按钮)部分工作(在代码中有注释)。


UserFragment

@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下的代码从未执行。 我尝试将操作栏标题从“Profile”更改为“Edit Profile”。日志向我显示“Edit Profile”,但实际运行的应用程序出于某种原因向我显示“Profile”。


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

非常感谢您的帮助!

1个回答

3
经过多日的分析,我发现问题出在我创建时使用了内置的导航抽屉活动。内置的将任务分为两个部分:MainActivityNavigationDrawerFragment。因此,在MainActivity中拥有的drawerToggleNavigationDrawerFragment中真正的drawerToggle不同。
最初,MainActivty调用NavigationDrawerFragment来设置导航抽屉所需的所有内容。我通过在MainActivity中实现导航抽屉来解决了这个问题,这样我就只有一个drawerToggle。尽管如此,如果我将所有东西(导航抽屉变量)放在NavigationDrawerFragment而不是MainActivity中,我仍然找不到使其工作的方法。如果有人知道答案,请随时留言!

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接