http://mixi-inc.github.io/AndroidTraining/fundamentals/2.02.activity-and-fragment.html
このページを中心に勉強した時のメモです
注意:筆者はど初心者です
Activityとは
出展:http://mixi-inc.github.io/AndroidTraining/fundamentals/2.02.activity-and-fragment.html
Fragmentとは
出展:http://mixi-inc.github.io/AndroidTraining/fundamentals/2.02.activity-and-fragment.html
ユーザーがアプリを起動した際のフロー
-
AndroidManifest.xml
(各種設定を記述するファイル)に、記載されているActivityからintent-filterタグ内に以下の属性を持つActivityを起動させる
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
- 該当するactivity(jp.mixi.assignment.controller.beg.MainActivity)の、onCreate()が起動
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Toast.makeText(this,"onCreateStart",Toast.LENGTH_LONG).show();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//dynamicFragmentの動的追加
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
dynamicFragment fragment = new dynamicFragment();
transaction.replace(R.id.f2, fragment);
transaction.commit();
Toast.makeText(this,"onCreateEnd",Toast.LENGTH_LONG).show();
}
- 全ての関数には、スーパークラスの関数を呼び出すこと(この場合、super.onCreate())
-
setContentView()
はによって、xmlが読み込まれる
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<!--静的追加するfragment-->
<fragment
android:id="@+id/f1"
android:name="jp.mixi.assignment.controller.beg.staticFragment"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@+id/main"/>
<!--動的追加するfragmentの入れ物-->
<LinearLayout
android:orientation="vertical"
android:id="@+id/f2"
android:layout_toRightOf="@+id/f1"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
</RelativeLayout>
- 読み込んだ時点では、フラグメントであるf1が、さらに作成される
- 作成するクラスは、
android:name=jp.mixi.assignment.controller.beg.staticFragment
で判断
package jp.mixi.assignment.controller.beg;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
/**
* Created by **** on 2017/05/14.
*/
public class staticFragment extends Fragment{
public staticFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Toast.makeText(getContext(),"onCreateView(staticFragment)",Toast.LENGTH_LONG).show();
return inflater.inflate(R.layout.static_fragment, container, false);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(getActivity().getBaseContext(), "onCreate(staticFragment)", Toast.LENGTH_LONG).show();
}
@Override
public void onStart() {
super.onStart();
Toast.makeText(getActivity().getBaseContext(), "onStart(staticFragment)", Toast.LENGTH_SHORT).show();
}
@Override
public void onActivityCreated(Bundle savedInstanceBundle) {
super.onActivityCreated(savedInstanceBundle);
Toast.makeText(getActivity().getBaseContext(), "onActivityCreated(staticFragment)", Toast.LENGTH_SHORT).show();
}
}
-
onCreate()
→onCreateView()
が起動 - Fragmentでも同じく、super.~~は必要
- Toastの第一引数のContextは、以下のうちのどれでも良い(なぜ??)
getActivity().getBaseContext()
または、
getActivity().getApplicationContext()
または
getActivity()
http://stackoverflow.com/questions/15364315/toast-inside-onclick-method-in-fragment
- onCreateView()で見える状態になるまで変化し、引き続き、xmlに戻る
- この時点では、静的Fragmentのみ、起動
- xmlの読み込みが終わったら、次は、以下の部分の処理
//dynamicFragmentの動的追加
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
dynamicFragment fragment = new dynamicFragment();
transaction.replace(R.id.f2, fragment);
transaction.commit();
-
FragmentManager
から、トランザクションを取得 - Fragment2(動的に入れるFragment)を作成し、トランザクションに仕込む
- ここで、挿入する要素をid(R.id.f2)で指定
-
onCreate()
が終わると、staticFragmentのonActivityCreated()
が起動 - onActivityCreated は属するActivity の onCreate の状態の処理が終わったことを示す状態です。
- 現在の状態
MainActivity : onCreate()
staticFragment : onActivityCreated()
dynamicFragment : 未起動
- 次のonStart()
に進みたいが、dynamicFragmentが未着手
- ここでやっとdynamicFragmentのonCreate()が起動
- onCreate(dynamic)
- onCreateView(dynamic)
- onActivityCreated(dynamic)
package jp.mixi.assignment.controller.beg;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
/**
* Created by **** on 2017/05/14.
*/
public class dynamicFragment extends Fragment {
public dynamicFragment() {
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Toast.makeText(getContext(), "onCreateView(dynamicFragment)", Toast.LENGTH_LONG).show();
return inflater.inflate(R.layout.dynamic_fragment, container, false);
}
//onclick時には必ず、super.onCreate(savedInstanceState);を置くこと
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(getActivity().getBaseContext(), "onCreate(dynamicFragment)", Toast.LENGTH_LONG).show();
}
@Override
public void onStart() {
super.onStart();
Toast.makeText(getActivity().getBaseContext(), "onStart(dynamicFragment)", Toast.LENGTH_SHORT).show();
}
@Override
public void onActivityCreated(Bundle savedInstanceBundle) {
super.onActivityCreated(savedInstanceBundle);
Toast.makeText(getActivity().getBaseContext(), "onActivityCreated(dynamicFragment)", Toast.LENGTH_SHORT).show();
}
}
- やっと、MainActivityの全ての要素がonCreateViewの状態まで遷移した!!!!
- 各要素のonStart()が起動
- onStart(static)
- onStart(dynamic)
- onStart()
- 基本的には、下位の要素と足並みが同じになる
- 下位の要素が揃ったら、上位の要素のプロセスが起動
途中に散りばめたToast.makeTextをまとめると、
以下のようになります
onCreateStart
onCreate(static)
oncreateView(static)
onCreateEnd
onActivityCreated(static)
onCreate(dynamic)
onCreateView(dynamic)
onActivityCreated(dynamic)
onStart(static)
onStart(dynamic)
onStart()
僕なりの解釈ですので、間違いだらけかなと感じます。。。。適宜修正します