Lazuli

らずり

Fragmentの差し替えがめんどくさい

はじめに

Fragmentを差し替える時に

FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment fragment = new HogeFragment();

transaction.replace(R.id.container, fragment);
transaction.addToBackStack(null);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.commit();

とかやるけど正直だるい。毎回こんなに書くのはなんかアレ。

変わりに

ActivityとFragmentでオーバーライドクラス作ってなんとか出来ないかと思ってやってみた。

/**
 * Activityをオーバーライドしたクラス
 * このクラスをActivityの派生クラスで継承する
 */
public class OverrideActivity extends Activity
{
    public void replaceFragment (AbstractFragment fragment)
    {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();

        transaction.replace(fragment.getContainerId(), fragment);
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}


/**
 * Fragmentを継承したAbstractクラス
 * Fragmentを差し替えるViewのidを返すメソッドを定義する
 */
public abstract class AbstractFragment extends Fragment
{
    public int container_id;

    abstract public int getContainerId();
}


/**
 * AbstractFragmentを継承した派生クラス
 */
public class HogeFragment extends AbstractFragment
{
    public int container_id = R.id.container;

    public int getContainerId ()
    {
        return container_id;
    }

    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.hoge_fragment, container, false);
    }
}


/**
 * OverrideActivityを継承した派生クラス 
 */
public class HogeActivity extends OverrideActivity
{
    @Override
    public void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hoge_activity);

        // HogeFragmentに差し替える
        super.replaceFragment(new HogeFragment());
    }
}


FragmentManagerを作ってーなんやかんやっていう処理をオーバーライドしたActivityに全部任せてしまう。
これで差し替えはsuper.replaceFragmentメソッド呼ぶだけでよくなる。

けど、痒いところには手が届いてない感じでもうちょっと改善の余地がありそう。
ListFragmentとかDialogFragmentはどないやねんとか使ったFragmentManagerが欲しいときはどうすんだとか。
なんかいい書き方はないものか。