我有活动包含2个片段(TitlesFragment和main_detailFragment):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_LinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:baselineAligned="false">
<fragment
android:id="@+id/main_titlesFragment"
class="ru.neverdark.phototools.fragments.TitlesFragment"
android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent"/>
<FrameLayout android:id="@+id/main_detailFragment"
android:layout_weight="2"
android:layout_width="0px"
android:layout_height="match_parent" />
我的应用程序包含5个不同的片段,可在 main_detailFragment FrameLayout中显示。
为了替换我编写的片段函数:
/**
* Replace current fragment to other
* @param details new fragment object
* @param index index fragment
*/
private void replaceFragment(Fragment details, int index) {
Log.message("Enter");
boolean isOperationNeed = false;
switch (index) {
case Constants.DOF_CHOICE:
try {
details = (DofFragment) getFragmentManager().findFragmentById(
R.id.main_detailFragment);
} catch (ClassCastException e) {
Log.message("Exception: " + e.getMessage());
}
if (details == null) {
details = new DofFragment();
isOperationNeed = true;
}
break;
case Constants.EV_CHOICE:
try {
details = (EvpairsFragment) getFragmentManager().findFragmentById(
R.id.main_detailFragment);
} catch (ClassCastException e) {
Log.message("Exception: " + e.getMessage());
}
if (details == null) {
details = new EvpairsFragment();
isOperationNeed = true;
}
break;
/* .. repeating code for other fragments */
}
if (isOperationNeed == true) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.main_detailFragment, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
当用户点击TitlesFragment中的项目时,我调用函数:
/**
* Shows fragment by index
* @param index fragment index for shown
*/
private void showFragment(int index) {
Log.message("Enter");
switch (index) {
case Constants.DOF_CHOICE:
replaceFragment(mDofFragment, index);
break;
case Constants.EV_CHOICE:
replaceFragment(mEvFragment, index);
/* ... */
}
}
在TitlesFragment上
public void onListItemClick(ListView listView, View view, int position, long id) {
Log.message("Enter");
showFragment(position);
}
如何改善功能 replaceFragment ?
在我的情况下,当用户通过单击TitlesFragment更改片段时,我有异常。我记录了原因,但不采取任何行动,就像在我的情况下,这是正常的。但我不喜欢这个代码,我不明白如何改进这个。
如何重写此函数以排除事件异常?
答案 0 :(得分:0)
单击ListView应显示片段。所以我假设你的常量看起来像这个f.e。
public static final int DOF_CHOICE = 0;
所以你可以像这样重写replaceFragment:
private void replaceFragment(int index) {
Fragment details = (Fragment)getFragmentManager().findFragmentById(
R.id.main_detailFragment);
switch (index) {
case Constants.DOF_CHOICE:
if(!details instanceof DofFragment)
details = new DofFragment();
else
return;
break;
case Constants.EV_CHOICE:
if(!details instanceof EvpairsFragment)
details = new EvpairsFragment();
else
return;
break;
/* .. repeating code for other fragments */
}
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.main_detailFragment, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
检查加载的碎片是否是使用instanceof
运算符的碎片实例。如果它不是它的实例,则创建一个新的Fragment并替换它。如果它是同一个实例,则不必替换它,因为已经显示了Fragment。我假设已经加载了片段,否则你必须检查details
是否为空。我没有测试,所以不要只是复制和粘贴,但你现在应该有这个想法。
现在你可以摆脱showFragment()方法。
对于此类问题,您应该使用code review site of stackexchange。