片段:如何改进代码?

阿尔特姆

我的活动包含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);
    /* ... */
    }
}

在标题片段上

public void onListItemClick(ListView listView, View view, int position, long id) {
    Log.message("Enter");
    showFragment(position);
}

我怎样才能改善功能replaceFragment

就我而言,当用户通过单击TitlesFragment更改片段时,我会遇到异常。我记录了原因,但不采取任何措施,就我而言,这是正常的。但是我不喜欢这段代码,而且我不知道该如何改进。

如何重写此功能以排除出现的异常?

史蒂夫·贝内特(Steve Benett)

单击您的ListView应该显示一个片段。所以我假设你的常数看起来像这样

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为null。我没有进行测试,所以不要只是复制和粘贴,但您现在应该有了主意。

现在您可以摆脱showFragment()方法。

顺便说一句,对于此类问题,您应该使用stackexchange的代码检查站点

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章