Fragment 静的生成
Fragmentを静的に描写する流れ
1.MainActivity.classを実行すると、onCreate()でレイアウト(activity_main.xml)を生成
2.activity_main.xmlに<fragmen>タグを記載しておくと、
レイアウト(activity_main.xml)を生成するときに、
<fragment>を記載した表示領域でFragment.classを呼び出す
3.呼び出されたFragment.classのonCreate()でレイアウト(fragment.xml)が生成され、
activity_main.xmlで記載した表示領域にfragment.xmlが描写される
MainActivity.class -> activity_main.xml -> Fragment.class -> fragment.xml
サンプルコード Fragmentの静的生成
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentCView(R.layout.activity_main); // <- ここでレイアウト生成
}}
//...
<fragment
android:id="@+id/fragmentArea"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
class="(パッケージ名).Fragment" //<- ここでFragment.javaを呼び出す
/>
public class Fragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
return inflater.inflate(R.layout.fragment,container,false);// <- fragmen.xmlをインフレート!
}
@Override
public void onActivityCreated(Bundle savedInstanceState){ // Fragment生成後の処理
super.onActivityCreated(savedIndtanceState);
TextView text = getActivity().findViewById(R.id.text);
text.setText("From Fragment !");
}
}
//...
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
}
Fragment 動的生成
Fragmentを動的に生成する流れ
1.MainActivity.classを実行すると、onCreate()でレイアウト(activity_main.xml)を生成
2.activity_main.xmlで<FrameLayout>を記載し、Fragmentの表示領域を確保
3.MainActivity.classで、Fragmentオブジェクトを生成して、
fragmentTransactionで、activity_main.xmlの<FrameLayout>にFragmentオブジェクトを配置
MainActivity.class -> activity_main.xml -> fragmentTransaction
サンプルコード Fragmentの動的生成
<FrameLayout
android:id="@+id/fragmentArea"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();//managerでTransactionを開始
Fragment fragment = new Fragment(); //Fragmentオブジェクト生成
transaction.add(R.id.fragmentArea,fragment); //transactionでactivity_main.xmlの\<framLayout>の描写領域にfragmentオブジェクトをセット
transaction.commit();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment,container,false); // <-レイアウト(fragment.xml)をインフレート!
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) { // fragmentオブジェクト生成後の処理
super.onActivityCreated(savedInstanceState);
TextView text = (TextView) getActivity().findViewById(R.id.text);
}
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
サンプルコード Fragmentで画面遷移風
ファイル構成
<fragment
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragmentArea"
class="cat.baby.sample.Fragment_Toolbar"
/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frameArea"
/>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment01 fragment_main = new Fragment01("1");
transaction.add(R.id.frameArea,fragment_main);
transaction.commit();
}
AppCompatActivity activity;
FrameLayout frameLayout;
FragmentManager manager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
activity = (AppCompatActivity) getActivity();
frameLayout = getActivity().findViewById(R.id.frameArea);
manager = activity.getSupportFragmentManager();
View view = inflater.inflate(R.layout.fragment_toolbar,container,false);
Toolbar toolbar = view.findViewById(R.id.toolbar);
activity.setSupportActionBar(toolbar);
setHasOptionsMenu(true);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.overflow_menu01,menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.menu01:
FragmentTransaction transaction_menu01 = manager.beginTransaction();
Fragment01 fragment_main = new Fragment01("1");
transaction_menu01.replace(R.id.frameArea,fragment_main);
transaction_menu01.commit();
return true;
case R.id.menu02:
FragmentTransaction transaction_menu02 = manager.beginTransaction();
Fragment01 fragment_second = new Fragment01("2");
transaction_menu02.replace(R.id.frameArea,fragment_second);
transaction_menu02.commit();
return true;
case R.id.menu03:
FragmentTransaction transaction_menu03 = manager.beginTransaction();
Fragment01 fragment_third = new Fragment01("3");
transaction_menu03.replace(R.id.frameArea,fragment_third);
transaction_menu03.commit();
}
return super.onOptionsItemSelected(item);
}
int fragmentRes;
public Fragment01(String no) {
switch(no){
case "1":
fragmentRes = R.layout.fragment_main;
break;
case "2":
fragmentRes = R.layout.fragment_second;
break;
case "3":
fragmentRes = R.layout.fragment_third;
break;
default:
fragmentRes = R.layout.fragment_main;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(fragmentRes,container,false);
return view;
}
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#abb"
android:id="@+id/toolbar"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="main"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="second"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="third"
/>
でもこれだけじゃ、戻れない!
fragmentTransaction.replace(R.id.fragment,XXX);の後に
fragmentTransaction.addToBackStack(null);を記載
これで戻れるそう。