我必须在这里多次使用instanceof
,同时检查Fragment
的子类是什么,我觉得我在某个地方出错:
@Override
public void onBackPressed() {
Fragment frag = mManager.findFragmentByTag("Fragment");
if(frag instanceof CustFragmentOne ||
frag instanceof CustFragmentTwo ||
frag instanceof CustFragmentThree ||
frag instanceof CustFragmentFour) {
//This method displays an instance of "CustFragmentFive"
displayView(0);
}
else if(frag instanceof CustFragmentFive)
super.onBackPressed();
else if(mManager.getBackStackEntryCount() > 0)
getFragmentManager().popBackStack();
else
super.onBackPressed();
}
有没有办法在这里使用它?我怎样才能识别片段的类型并相应地调用正确的方法?
答案 0 :(得分:2)
最简单的方法是让CustFragmentOne,CustFragmentTwo等实现一个通用接口。这样,您只需要针对该接口执行单个instanceof检查,而不需要单独检查每个具体类。
另一种方式就是沿着这些方向:How to implement onBackPressed() in Fragments?
答案 1 :(得分:2)
使用界面。例如:
public interface ICustomFragment {
public boolean shouldNavigateBack();
然后你可以这样做:
@Override
public void onBackPressed() {
CustomFragment frag = (CustomFragment)mManager.findFragmentByTag("Fragment");
if(frag.shouldNavigateBack()) {
//This method displays an instance of "CustFragmentFive"
displayView(0);
}
else {
super.onBackPressed();
}
答案 2 :(得分:0)
if(frag.getClass() == CustFragmentOne.class)
不确定哪种方法更好
答案 3 :(得分:0)
为什么不将Fragment对象保留在Activity中?
CustFragmentOne fragment1 = (FragmentOne)getFragmentManager().findFragmentById(R.id.fragment1);
CustFragmentTwo fragment2 = (FragmentOne)getFragmentManager().findFragmentById(R.id.fragment2);
在你的布局xml文件中,你会像这样:
<FrameLayout
...>
<fragment
android:id="@+id/fragment1"
android:name="com.smartmirror.FragmentOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<fragment
android:id="@+id/fragment2"
android:name="com.smartmirror.FragmentTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>
答案 4 :(得分:0)
我建议你使用这样的东西来控制碎片上的后退按钮:
创建基础片段抽象类:
public abstract class BaseFragment extends Fragment {
public void onBackPressed() {
}
}
从BaseFragment扩展所有片段
公共类CustFragmentOne扩展了BaseFragment { ... }
更改您的活动
@Override
public void onBackPressed() {
Fragment frag = mManager.findFragmentByTag("Fragment");
if(frag instanceof BaseFragment)
frag.onBackPressed();
else if(mManager.getBackStackEntryCount() > 0)
getFragmentManager().popBackStack();
else
super.onBackPressed();
}
使用您想要的逻辑在片段中覆盖onBackPressed()方法。
答案 5 :(得分:0)
您总是可以创建一个BaseFragment,它将Fragment扩展为所有片段。然后你可以让每个片段根据需要处理它,使它更清洁。 e.g。
public class BaseFragment extends Fragment {
public void onBackPressed() {
// Override this function in your fragment classes as needed
}
}
或者您可以执行类似(Android Fragment handle back button press)
的操作