内部片段的回溯

时间:2018-04-12 05:46:56

标签: android android-fragments android-viewpager android-tablayout

可能是问题标题很常见,但问题不是。我正在使用一个Activity,其中框架布局我用FragmentTransactionFragmentManager替换片段。这是成功完成我得到了新片段让我们说片段A.现在在片段A我有viewpager有三个标签,每个标签都有片段所以在片段A中我有片段B,片段C和片段D。

  

整个场景活动 - >替换framelayout - >片段A->三   标签(三个片段片段B,片段C和片段D)

现在问题

如果我在第二个标签中,如果我回来按,那么我会直接进入活动。如果在第二个或第三个选项卡中然后移动到之前的选项卡,如果在第一个选项卡中,则转到活动页面。

可能在片段回溯中自动维护,但如果在Activity中使用则只有。现在我正在使用片段来保持标签。

我尝试了什么:

我创建了监听器:

PageChangeListener:

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方法。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

@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.
  }
}

答案 1 :(得分:2)

  

在哪里使用onPrivousRequest()方法,因为片段没有onBackPressed方法。

有办法:

Step1:创建和界面

public interface OnFragmentBackPressed {
    boolean onBackPressed();
}

第2步:在片段中实现它

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();
       }
    }
}

答案 2 :(得分:2)

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

public interface IOnBackPressed {
   void onBack();
}

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

现在,当您将其添加到活动时,您需要将其与您的片段(在您的情况下为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. 
    }

}

如果您的活动托管FragmentA以外的其他片段非常简单,则需要处理活动完成逻辑或逻辑。