51歳から（現52）のプログラミング　備忘　Fragment　静的　動的

#Fragment 静的生成
##Fragmentを静的に描写する流れ
１．MainActivity.classを実行すると、onCreate()でレイアウト(activity_main.xml）を生成
２．activity_main.xmlに\<fragmen>タグを記載しておくと、
　　レイアウト(activity_main.xml)を生成するときに、
　　\<fragment>を記載した表示領域でFragment.classを呼び出す
３．呼び出されたFragment.classのonCreate()でレイアウト(fragment.xml)が生成され、
　　activity_main.xmlで記載した表示領域にfragment.xmlが描写される

MainActivity.class　->　activity_main.xml　->　Fragment.class　->　fragment.xml

##サンプルコード Fragmentの静的生成
```java:MainActivity.java
@Override 
protected void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentCView(R.layout.activity_main); // <- ここでレイアウト生成
}}
```
```java:activity_main.xml
//...
<fragment
   android:id="@+id/fragmentArea"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   class="(パッケージ名).Fragment" //<- ここでFragment.javaを呼び出す
   />
```
```java: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 !");
   }
}
```
```java:fragment.xml
//...
<TextView
   android:id="@+id/text"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   />
}
```

#Fragment 動的生成
##Fragmentを動的に生成する流れ
１．MainActivity.classを実行すると、onCreate()でレイアウト(activity_main.xml)を生成
２．activity_main.xmlで\<FrameLayout>を記載し、Fragmentの表示領域を確保
３．MainActivity.classで、Fragmentオブジェクトを生成して、
　　fragmentTransactionで、activity_main.xmlの\<FrameLayout>にFragmentオブジェクトを配置

MainActivity.class　->　activity_main.xml　->　fragmentTransaction

##サンプルコード Fragmentの動的生成
```java:activity_main.xml
<FrameLayout
   android:id="@+id/fragmentArea"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   />
```

```java:MainActivity.java
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();
```
```java:Fragment.java

@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);
}
```
```java:fragment.xml
<TextView
   android:id="@+id/text"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   />
```

#サンプルコード Fragmentで画面遷移風

##ファイル構成
![020215-1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399000/bad95fe6-1e75-ea59-b450-7a4c6db1cf13.jpeg)


```java:activity_main.xml
<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"
    />
```
```java:MainActicity.java
@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();
}
```
```java:Fragment_Toolbar.java
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);
}
```
```java:Fragment01.java
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;
}
```
```java:fragment_toolbar.xml
<androidx.appcompat.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="#abb"
    android:id="@+id/toolbar"
    />
```
```java:fragment_main.xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="main"
    />
```
```java:fragment_second.xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="second"
    />
```
```java:fragment_third.xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="third"
    />
```
でもこれだけじゃ、戻れない！
fragmentTransaction.replace(R.id.fragment,XXX);の後に
fragmentTransaction.addToBackStack(null);を記載
これで戻れるそう。