向上导航(操作栏的后退箭头)不适用于片段 [英] Up Navigation (Action Bar's back arrow) is not working for fragments

查看:71
本文介绍了向上导航(操作栏的后退箭头)不适用于片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经将抽屉式布局作为活动的基本布局,并且我要替换抽屉式布局内部存在的框架上的两个片段.第一个片段未添加到片段的后堆栈中.我在活动中显示汉堡包图标(我也希望在第一个片段中显示抽屉菜单).在第二个片段中,我通过mActionBarDrawerToggle.setDrawerIndicatorEnabled(false)禁用了汉堡包图标,并使用actionBar.setDisplayHomeAsUpEnabled(true)启用了后退按钮.

I've drawer-layout as a base layout of my activity and I'm replacing two fragments on a frame present inside this drawer-layout. The first fragment is not added in fragment's back stack. I'm displaying hamburger icon in my activity (I also want the drawer menu in my first fragment). In second fragment I disabled the hamburger icon by mActionBarDrawerToggle.setDrawerIndicatorEnabled(false) and enabled back button using actionBar.setDisplayHomeAsUpEnabled(true).

在onResume的第一个片段中,我通过mActionBarDrawerToggle.setDrawerIndicatorEnabled(true)启用了汉堡包图标,以便当用户从第二个片段按下后退按钮(硬件和操作栏的向上按钮)时,用户将回到第一个片段和汉堡包图标将被启用.一切工作正常,只有我无法从第二个片段操作栏的后退"按钮返回.我无法点击它. 以下是我的代码:-

In first fragments onResume I enabled hamburger icon by mActionBarDrawerToggle.setDrawerIndicatorEnabled(true)` so that when user presses back button (both hardware and action-bar's up button) from second fragment,user will come back to first fragment and hamburger icon will be enabled. Everything is working fine only I'm not able to go back from second fragments action bar back button. I'm not able to click it. Below is my code :-

活动代码

if (Utility.isLargeScreen(this))
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    else
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    mHiddenGemsApplication = (HiddenGemsApplication) getApplication();

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    initViews();

    setSupportActionBar(mToolbar);
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
    mTextViewActionBarTitle.setText(getString(R.string.app_name));

    mActionBarDrawerToggle = new ActionBarDrawerToggle(HomeActivity.this, mDrawerLayout, mToolbar, R.string.open_drawer, R.string.close_drawer) {

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
        }
    };

    mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);

    mActionBarDrawerToggle.syncState();

    mFragmentManager = getSupportFragmentManager();

    replaceFragment(new CategoryFragment(), getString(R.string.app_name), CategoryFragment.TAG);

 @Override
public void onBackPressed() {

    if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
        mDrawerLayout.closeDrawers();
        return;
    }
    super.onBackPressed();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case android.R.id.home:
            if (mFragmentManager.getBackStackEntryCount() > 0) {
                mFragmentManager.popBackStack();
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

 public void replaceFragment(Fragment fragment, String actionBarTitle, String tag) {

    if (mFragmentManager == null)
        return;

    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.content_frame, fragment, tag);
    if (!tag.equals(CategoryFragment.TAG))
        fragmentTransaction.addToBackStack(tag);
    fragmentTransaction.commit();

    setActionBarTitle(actionBarTitle);
}

public void setActionBarTitle(String actionBarTitle) {
    if (!TextUtils.isEmpty(actionBarTitle))
        mTextViewActionBarTitle.setText(actionBarTitle);
}

public void setDrawerIndicatorEnabled(boolean value) {
    if (mActionBarDrawerToggle != null) {
        mActionBarDrawerToggle.setDrawerIndicatorEnabled(value);
    }
}

活动XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="nirvaniclabs.com.hiddengems.activities.HomeActivity">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <include
        android:id="@+id/toolbarlayout"
        layout="@layout/toolbar_layout" />

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toolbarlayout" />
</RelativeLayout>

<android.support.design.widget.NavigationView
    android:id="@+id/navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:menu="@menu/navigation_items" />

</android.support.v4.widget.DrawerLayout>

第一个片段:-

 private Button mButtonTemp;
private AppCompatActivity mActivity;
public static String TAG = "CategoryFragment";

public CategoryFragment() {
    // Required empty public constructor
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    if (context instanceof Activity)
        mActivity = (AppCompatActivity) context;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View viewGroup = inflater.inflate(R.layout.fragment_category, container, false);
    initViews(viewGroup);

    mButtonTemp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            ((HomeActivity) mActivity).replaceFragment(new TripListFragment(), "Trip Fragment", TripListFragment.TAG);
        }
    });

    return viewGroup;
}

private void initViews(View viewGroup) {
    mButtonTemp = (Button) viewGroup.findViewById(R.id.btn_temp);
}

@Override
public void onResume() {
    super.onResume();
    ((HomeActivity) mActivity).setDrawerIndicatorEnabled(true);
    ((HomeActivity) mActivity).setActionBarTitle(getString(R.string.app_name));
}

第二个片段

  private AppCompatActivity mActivity;
public static String TAG = "TripListFragment";

public TripListFragment() {
    // Required empty public constructor
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof Activity)
        mActivity = (AppCompatActivity) context;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setHasOptionsMenu(true);
    ActionBar actionBar = mActivity.getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_trip_list, container, false);
}


@Override
public void onResume() {
    super.onResume();
    ((HomeActivity) mActivity).setDrawerIndicatorEnabled(false);
}

此外,当我处于第二个片段中时,我可以滑动并查看抽屉菜单.我不希望这种行为,抽屉菜单只能在片段1中打开.

Also, when I'm in second fragment I'm able to swipe and see the drawer menu. I don't want this behaviour, drawer menu should only open in fragment 1.

如果我的代码有任何错误,请告诉我.

If any thing is wrong in my code please let me know.

推荐答案

最后得到了答案.在我的场景中,我要通过mActionBarDrawerToggle.setDrawerIndicatorEnabled(false);禁用抽屉指示器,并且由于此导航图标的点击被禁用.要启用此功能,我必须在ActionBarDrawerToggle中添加ToolbarNavigationClickListener,这将启用导航图标单击.

Finally got the answer. In my scenario I'm disabling the drawer indicator by mActionBarDrawerToggle.setDrawerIndicatorEnabled(false); and due to this Navigation icon clicks got disabled. To enable this I've to add ToolbarNavigationClickListener to ActionBarDrawerToggle which will enable navigation icon clicks.

下面是我的工作代码:-

Below is the my working code :-

mActionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });

请参阅此链接以获取更多说明

这篇关于向上导航(操作栏的后退箭头)不适用于片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆