如何在片段

时间:2017-10-12 14:37:57

标签: java android

我有一个导航抽屉,在其第一个片段中我有一个新闻页面,用户点击按钮查看整个新闻,此时它会输入另一个片段。

我想知道如何实现箭头以返回上一个片段而不是打开导航抽屉的图标。

我以前从未使用过这个,我不知道。

这是我在MainActivity中的工具栏

appBarLayout = (AppBarLayout) findViewById(R.id.appBarLayout);

toolbar = (Toolbar) findViewById(R.id.toolbar);
//toolbar title
toolbar.setTitle(null);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
// Toolbar logo
logoToolbar = (ImageView) findViewById(R.id.logoToolbar);
logoToolbar.setImageResource(R.drawable.newstoolbar);

当用户点击MainFragment中的“Read More”

newsMore.get(0).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);

                newsFrag1 newsFragment1 = new newsFrag1();
                ft.replace(R.id.fragment_container, newsFragment1);
                ft.commit();
            }
});

然后转到newsFrag1,我想要后退箭头

我的工具栏XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="studio.com.archeagemanager.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:elevation="0dp">


        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:layout_weight="1"
            android:background="?attr/colorPrimary"
            android:gravity="center_vertical"
            android:minHeight="56dp"
            android:weightSum="1"
            app:popupTheme="@style/AppTheme.PopupOverlay">

            <ImageView
                android:id="@+id/logoToolbar"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center" />

        </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="56dp">
    </FrameLayout>

</android.support.design.widget.CoordinatorLayout>

1 个答案:

答案 0 :(得分:2)

碎片通常不会拦截反向/向上按压。这通常是在活动级别完成的。这背后的原因是因为你可以在屏幕上同时拥有多个片段...那么哪一个首先处理背压?

要在您的活动中处理它,请考虑跟踪您的前后状态。让我们使用片段计数作为示例状态:

@Override
public void onBackPressed() {
  // for every back press, if there is a fragment to remove, then remove it first
  if (getFragmentManager().getBackStackEntryCount() > 0) {
    getFragmentManager().popBackStack();
    return;
  }
  super.onBackPressed();

}

您还需要确保将原始片段事务添加到Backstack:

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);

newsFrag1 newsFragment1 = new newsFrag1();
ft.replace(R.id.fragment_container, newsFragment1);
ft.addToBackStack();
ft.commit();

编辑:我想从你的xml中你要求的是UP导航,而不是BACK导航。如果是这种情况,那么您仍然需要利用backstack,但所有工作都需要由父活动完成(因为活动拥有工具栏)

getSupportFragmentManager()
  .addOnBackStackChangedListener(new OnBackStackChangedListener(){
      @Override
      public void onBackStackChanged() {
        updateToolbarUp();
      }
  });

public void updateToolbarUp(){
  boolean showUp = getSupportFragmentManager().getBackStackEntryCount() > 0;
  getSupportActionBar().setDisplayHomeAsUpEnabled(showUp);
}

然后覆盖向上按钮以简单地弹出后台堆:

@Override
public boolean onSupportNavigateUp() {
  getSupportFragmentManager().popBackStack();
  return true;
}