可能是问题标题很常见,但问题不是。我正在使用一个Activity,其中框架布局我用FragmentTransaction
和FragmentManager
替换片段。这是成功完成我得到了新片段让我们说片段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方法。
任何帮助将不胜感激。
答案 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
以外的其他片段非常简单,则需要处理活动完成逻辑或逻辑。