Fragment学習
3839 ワード
1.Fragmentロールバックスタック管理
Activityはタスクスタックによって管理され、先進的な後出の原則に従い、Fragmentも同様のスタック管理を実現することができ、それによって複数のFragmentが前後して追加された後に前のFragmentに戻ることができ、activityコンテナ内にFragmentがない場合に戻るとActivityを終了する.具体的な方法:FragmentTransaction.addToBackStack(String)/通常nullに入力するコードは以下の通りです.Fragment f = new Fragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ftx = fm.beginTransaction();
ftx.replace(R.id.fragment_container, f, "tag");
ftx.addToBackStack(null);
ftx.commit();
注意:1.Activityの最初のFragment(ルートFragment)は、最後のFragmentが戻るときに空白ではなくactivityを直接終了するように、ロールバックスタックを追加しないことができます.2.addToBackStack(null)を呼び出すと、現在のトランザクションがロールバックスタックに追加され、replaceメソッドを呼び出すとFragmentインスタンスは破棄されませんが、ビュー階層は破棄され、onDestoryViewとonCreateViewが呼び出されます.現在のfragmentビューの状態を保存するには、hide後addの新しいFragmentを使用します.
2、FragmentとActivity通信
一般的な方法:
Activity呼び出しFragmentメソッド:Activityに自己管理のFragmentの参照が含まれている場合は、参照によってすべてのFragmentに直接アクセスできるpublicメソッドFragmentによってActivityメソッドを呼び出す:FragmentでgetActivityによって現在バインドされているActivityのインスタンスを取得し、操作を行う
推奨方法:
1.インタフェース(FragmentはActivity)Fragment部分コードにデータを返す:public class TestFragment extends Fragment {
private OnSaveListener listener;
public void setListener(OnSaveListener listener) {
this.listener = listener;
}
public interface OnSaveListener {
void onSaveFinished(boolean result);
void onSaveStart();
}
@OnClick(R.id.btn_save)
public void save() {
....
listener.onSaveFinished(true);
}
}
Activity部分コード:TestFragment f = new TestFragment();
f.setListener(new ShowCheckFragment.OnSaveListener() {
@Override
public void onSaveFinished(boolean result) {
......
}
@Override
public void onSaveStart() {
......
}
});
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, f);
fragmentTransaction.commit();
2.Fragment Arguments(Fragmentにデータを渡す)Fragment部分コード:ublic class TestFragment extends Fragment
{
private String mArgument;
public static final String ARGUMENT = "argument";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if (bundle != null)
mArgument = bundle.getString(ARGUMENT);
}
/**
* , arguments
* @param argument
* @return
*/
public static TestFragment newInstance(String argument)
{
Bundle bundle = new Bundle();
bundle.putString(ARGUMENT, argument);
TestFragment f = new TestFragment();
f.setArguments(bundle);
return f;
}
3、Fragment重複問題
スクリーンの回転やメモリの再起動(Fragmentおよびコンテナactivityがシステムによって回収されてから開くと再初期化)は、activity自体が再起動されるとFragmentが復元され、Fragmentのコードが作成されて新しいFragmentが作成されるため、Fragmentが重なる問題を引き起こします.解決方法:onCreateメソッドでパラメータBundle savedInstanceStateを判断し、空の場合にFragmentインスタンスを初期化し、その後、FragmentでonSaveInstanceStateのメソッドでデータActivityコードを復元します.
private TestFragment f;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, savedInstanceState+"");
if(savedInstanceState == null)
{
f = new TestFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, f, "ONE");
tx.commit();
}
}
Fragment f = new Fragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ftx = fm.beginTransaction();
ftx.replace(R.id.fragment_container, f, "tag");
ftx.addToBackStack(null);
ftx.commit();
一般的な方法:
Activity呼び出しFragmentメソッド:Activityに自己管理のFragmentの参照が含まれている場合は、参照によってすべてのFragmentに直接アクセスできるpublicメソッドFragmentによってActivityメソッドを呼び出す:FragmentでgetActivityによって現在バインドされているActivityのインスタンスを取得し、操作を行う
推奨方法:
1.インタフェース(FragmentはActivity)Fragment部分コードにデータを返す:
public class TestFragment extends Fragment {
private OnSaveListener listener;
public void setListener(OnSaveListener listener) {
this.listener = listener;
}
public interface OnSaveListener {
void onSaveFinished(boolean result);
void onSaveStart();
}
@OnClick(R.id.btn_save)
public void save() {
....
listener.onSaveFinished(true);
}
}
Activity部分コード:
TestFragment f = new TestFragment();
f.setListener(new ShowCheckFragment.OnSaveListener() {
@Override
public void onSaveFinished(boolean result) {
......
}
@Override
public void onSaveStart() {
......
}
});
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, f);
fragmentTransaction.commit();
2.Fragment Arguments(Fragmentにデータを渡す)Fragment部分コード:
ublic class TestFragment extends Fragment
{
private String mArgument;
public static final String ARGUMENT = "argument";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if (bundle != null)
mArgument = bundle.getString(ARGUMENT);
}
/**
* , arguments
* @param argument
* @return
*/
public static TestFragment newInstance(String argument)
{
Bundle bundle = new Bundle();
bundle.putString(ARGUMENT, argument);
TestFragment f = new TestFragment();
f.setArguments(bundle);
return f;
}
3、Fragment重複問題
スクリーンの回転やメモリの再起動(Fragmentおよびコンテナactivityがシステムによって回収されてから開くと再初期化)は、activity自体が再起動されるとFragmentが復元され、Fragmentのコードが作成されて新しいFragmentが作成されるため、Fragmentが重なる問題を引き起こします.解決方法:onCreateメソッドでパラメータBundle savedInstanceStateを判断し、空の場合にFragmentインスタンスを初期化し、その後、FragmentでonSaveInstanceStateのメソッドでデータActivityコードを復元します.
private TestFragment f;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, savedInstanceState+"");
if(savedInstanceState == null)
{
f = new TestFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, f, "ONE");
tx.commit();
}
}
private TestFragment f;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, savedInstanceState+"");
if(savedInstanceState == null)
{
f = new TestFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, f, "ONE");
tx.commit();
}
}