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

Lan*_*lot 11 navigation android navigation-drawer

我有一些问题将导航抽屉功能切换到较低级别片段的向上功能.我已阅读此主题以设法显示向上指示器.但是当按下按钮时,它会打开导航抽屉,而不是回到之前的片段.我无法在EditUserFragment中将操作栏标题设置为"编辑配置文件".我正在使用Android Studio中提供的导航抽屉模板.

我有三个级别:

  1. 带有导航抽屉的MainActivity,包括Home和Profile项目
  2. UserFragment标题为"个人资料",其中包含一个选项,可以显示EditUserFragment
  3. 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());
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

EditUserFragment

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


我想实现的是能够回去UserFragmentEditUserFragment点击向上指示器(现在向上指示灯开放抽屉式导航栏).并显示正确的标题EditUserFragment.

任何帮助是极大的赞赏!!

Lan*_*lot 3

经过几天的分析,我发现问题是我在创建它时使用了内置的导航抽屉活动。内置将任务分成两部分。MainActivityNavigationDrawerFragment。因此,drawerToggle中的 IMainActivity与 中的真实值并不相同NavigationDrawerFragment

最初,MainActivty调用NavigationDrawerFragment来设置导航抽屉所需的所有内容。我通过在我的 中实现导航抽屉解决了MainActivity这个问题,所以我只有一个drawerToggle。不过,如果我将所有内容(导航抽屉变量)放在而NavigationDrawerFragment不是MainActivity. 如果有人知道答案,请随时发表评论!