LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-13

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の静的生成

MainActivity.java
@Override 
protected void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentCView(R.layout.activity_main); // <- ここでレイアウト生成
}}
activity_main.xml
//...
<fragment
   android:id="@+id/fragmentArea"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   class="(パッケージ名).Fragment" //<- ここでFragment.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 !");
   }
}
fragment.xml
//...
<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の動的生成

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

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

ファイル構成

020215-1.JPG

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"
    />
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();
}
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);
}
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;
}
fragment_toolbar.xml
<androidx.appcompat.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="#abb"
    android:id="@+id/toolbar"
    />
fragment_main.xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="main"
    />
fragment_second.xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="second"
    />
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);を記載
これで戻れるそう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0