内部片段的回溯

Backtrace for inner fragments

可能问题标题很常见,但问题不是。我正在使用一个 Activity 框架布局,我将片段替换为 FragmentTransactionFragmentManager 。这是成功完成的,我得到了新的片段,比如说片段 A。现在在片段 A 中,我有 viewpager 三个选项卡,每个选项卡都有片段,所以在片段 A 中,我有片段 B、片段 C 和片段 D。

Whole scenario Activity-> replacing framelayout -> Fragment A-> three tabs (three fragments Fragment B,Fragment C and Fragment D)

现在问题

当我在第二个选项卡中时,如果我向后按,那么我会直接移动到 activity。我想如果在第二个或第三个选项卡中,则移至上一个选项卡,如果在第一个选项卡中,则移至 activity 页面。

可能在片段回溯中自动维护,但如果在 Activity 中使用则仅。现在我正在使用片段来保存选项卡。

我尝试了什么:

我已经创建了监听器:

页面变化监听器:

public interface PageChangeListener {
    public void onNextRequest();
    public void onPrivousRequest();
}

在片段 A 中实现了这个:

 @Override
    public void onNextRequest() {
        if(mViewPagerPage + 1 < mPageCount)
        {
            viewPager.setCurrentItem(++mViewPagerPage,true);
        }
    }

    @Override
    public void onPrivousRequest() {

        if(mViewPagerPage -1 >= 0)
        {
            viewPager.setCurrentItem(--mViewPagerPage,true);
        }

    }

但这个问题是:在哪里使用 onPrivousRequest() 方法,因为片段没有 onBackPressed 方法。

任何帮助将不胜感激。

@Override
public void onBackPressed() {
  if(i_dont_want_to_leave) {
     myViewPager.setCurrentItem(0, true);
  } else {
    super.onBackPressed(); // This will pop the Activity from the stack.
  }
}

where to use onPrivousRequest() method as fragments don't have onBackPressed Method.

有办法做到:

第一步:创建和接口

public interface OnFragmentBackPressed {
    boolean onBackPressed();
}

第 2 步:在您的 Fragment 中实现它

public class TabFragment extends Fragment implements OnFragmentBackPressed {

   @Override
   public boolean onBackPressed() {
       if (Condition: Check if you have to move on other tabs) {
            return true; 
        } else {
            return false;
        }
    }
}

第 3 步:在您的 Activity 覆盖 onBackPressed()

public class FragmentContainerActivity extends AppCompatActivity {

    @Override 
    public void onBackPressed() {
    Fragment mF = getSupportFragmentManager().findFragmentById(R.id.main_container);
       if (!(mF instanceof OnFragmentBackPressed) || !((OnFragmentBackPressed) mF).onBackPressed()) {
          super.onBackPressed(); // This won't get called unless you return false in Fragment's onBackPressed();
       }
    }
}

首先,您需要一个可以在按下后退键时与片段通信的接口。

public interface IOnBackPressed {
   void onBack();
}

在您的活动中创建 IOnBackPressed 的对象,我们将其命名为 onBackPressedImpl

现在,当您将它添加到 activity

时,您需要将它与您的片段(在您的情况下 FragmentA)绑定
 FragmentA fragA = new FragmentA();
    onBackPressedImpl = (IOnBackPressed) fragA ;
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.container, fragA, FragmentA.class.getSimpleName());
    ft.commit();

在您的活动中覆盖 onBackPressed()

 @Override
public void onBackPressed() {
   // super.onBackPressed(); IMPORTANT PART
    onBackPressedImpl.onBackPressed();
}

然后在你的 FragmentA 中你需要实现 OnBackPressed 接口并实现它的方法,在那个方法里面,你需要把改变标签的逻辑.. 像这样

@Override
public void onBack() {
    if (viewPager.getCurrentItem() != 0) {
        viewPager.setCurrentItem(viewPager.getCurrentItem() - 1,false);
    }else{
         finish(); // OR somthing other that finish() depends your application backstack. 
    }

}

您需要处理 activity 完成逻辑或如果您的 activity 托管不同于 FragmentA 的不同片段的逻辑,这很容易。