読者です 読者をやめる 読者になる 読者になる

【Android】デザインパターン(Singleton)

Android

 

「Singletonパターン」

まずは実装からです。

-----------------------------------------------------------------------------------------------------------

<呼ばれる側>

public class MainFragment extends Fragment {

  private static String SECTION = "SECTION";

  int section = 0;

  ※staticメソッドで定義

  public static MainFragment newInstance(int section) {

    ※自分自身のインスタンス作成
    MainFragment fragment = new MainFragment();

    ※パラメータの入れ物となるBundleオブジェクト生成

    ※section(どのFragmentオブジェクトかの目印を設定)
    Bundle args = new Bundle();

    args.putInt(SECTION, section);
    fragment.setArguments(args); ※設定
    return fragment;
  }
  @Override
  public View onCreateView(LayoutInflater inflater,

              ViewGroup container,

              Bundle savedInstanceState) {

    int section = getArguments().getInt(SECTION);  ※取得

    View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    return rootView;
  }
}

-----------------------------------------------------------------------------------------------------------

<呼びだし側>

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    ※追加(第1引数はViewGroup、第2引数は追加するfragment)
    ft.add(R.id.container, MainFragment.newInstance(1));
    ft.commit();
  }
}

-----------------------------------------------------------------------------------------------------------

<レイアウト>

activity_main.xml

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/layout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <!-- メイン用 -->
  <FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
</LinearLayout>

-----------------------------------------------------------------------------------------------------------

 

Singletonパターンの使い道は?

を理解するには、ほかのやり方ではなぜダメなのかを理解するのが早道です。

 

・コンストラクタ(引数あり)

・ゲッター・セッター

でも同じようなことができるのでは?

 

いっけんできそうですが、ダメなタイミングがあります。

Fragmentは破棄(バッググラウンドにまわったときなど)⇒再開時に

再度生成されますが、

この時はコンストラクタ(引数なし)が呼ばれる為、

コンストラクタ(引数あり)を定義するとコンストラクタ(引数なし)は

無い為再開時にエラーになります。

また再開時はセッターは呼ばれないため(コンストラクタしか呼ばれない)

セッターでセットしたフィールド値は初期値に戻ってしまいます。

 

結論

setArgumentsで渡したBundleオブジェクトは、

Fragment再生成時に復元されるため、Fragment破棄を考慮した

Singletonパターンが有効だとわかります。