内部片段的回溯
Backtrace for inner fragments
可能问题标题很常见,但问题不是。我正在使用一个 Activity 框架布局,我将片段替换为 FragmentTransaction
和 FragmentManager
。这是成功完成的,我得到了新的片段,比如说片段 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
的不同片段的逻辑,这很容易。
可能问题标题很常见,但问题不是。我正在使用一个 Activity 框架布局,我将片段替换为 FragmentTransaction
和 FragmentManager
。这是成功完成的,我得到了新的片段,比如说片段 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
的不同片段的逻辑,这很容易。