正しいFragmentの生成方法です。
Fragmentでは、引数付きのconstructorで生成してはいけないルールがあります。
空のconstructorをFragment内に定義し、Fragmentに引数を渡したい場合は、
Budleを使って値を渡す必要があります。
では、例を見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int age = 39; String name = "jiji"; // 1.FactoryPatternでageとnameをBlankFragmentに渡す BlankFragment fragment = BlankFragment.newInstance(name, age); getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit(); } } |
1.BlankFragmentのFactoryメソッドにより、BlankFragmentを生成し、
BlankFragmentを挿入しています。
Framgentを作成する
次にBlankFragmentを見ていきます。
BlankFragmentはAndroid Studioの新規ファイル作成から空のFragmentを作成するから
作成したのもので、作成時のオプションでFactory PatternによるFragmentの作成を入れるか
ActivityからのListnerを作成するかのオプションを選ぶことができます。
今回は、FactoryMethodのみにチェックを入れています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * A simple {@link Fragment} subclass. * Use the {@link BlankFragment#newInstance} factory method to * create an instance of this fragment. */ public class BlankFragment extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_AGE = "age_key"; private static final String ARG_NAME = "name_key"; private int age; private String name; public BlankFragment() { // Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment BlankFragment. */ // TODO: Rename and change types and number of parameters public static BlankFragment newInstance(String name, int age) { BlankFragment fragment = new BlankFragment(); Bundle args = new Bundle(); // 1.nameとageをbundleにセットする args.putInt(ARG_AGE, age); args.putString(ARG_NAME, name); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 2.FractoryメソッドでBundleに登録した変数を呼び出す if (getArguments() != null) { age = getArguments().getInt(ARG_AGE); name = getArguments().getString(ARG_NAME); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_blank, container, false); } } |
1.自動で、FactoryパターンであるnewInstance関数が作られています。
Activityから受け取ったageとnameをBundleにセットし、
setArgments関数で、fragmentにセットしています。
2.onCreate関数で、セットしたBundleの情報を引っ張っています。
先ほど、setArgments関数でセットしたBundleを
getArgments関数で呼び出し、各々変数に代入することで、
FragmentにActivityの変数をセットすることができました。