2 つのフラグメントを持つ単純なアプリがあり、横向きモードでは両方のフラグメントが並べて表示され、縦向きではフラグメント A が表示され、オプションを選択すると、フラグメント B を表示するアクティビティが開始されます。ポートレート モードでフラグメント B を表示しているときに、ユーザーがメニュー オプションを選択すると、フラグメント B に関連付けられているビューを更新または再描画したいのですが、これを機能させる方法がわかりません。getView メソッドと getLayoutInflater メソッドを試しましたが、新しいビューを作成していると思うため、画面は変わりません。また、フラグメント A への参照を取得しようとしましたが、そのルーチンを呼び出して新しいフラグメントを構築し、フラグメント B を置き換えることができると考えていましたが、表示されていないため参照を取得できませんでした。本当に必要なのは、新しいビューを膨らませるために onCreateView メソッドを強制的に再度呼び出すことですが、これを行うためにいくつかの方法を試しましたが、onCreateView を再度呼び出すことはできません。これについて何か考えはありますか?
2 に答える
を実行し、メソッドFragmentTransaction
を使用する必要がありますreplace()
これはそれほど難しいことではありませんが、答えはメニューがどこにあるかによって異なります(つまりonOptionsItemSelected()
、親アクティビティ内でのコールバックか、フラグメントA / B内か)。
簡単にするために、メニューの実装onOptionsItemSelected()
が親アクティビティにあり、menu_option1が選択された場合にフラグメントの形状を変更するとします。次のようになります。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
//...
switch (item.getItemId()) {
case R.id.menu_option1:
//do something
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new YourFragmentClass();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.your_fragment_id, newFragment);
transaction.addToBackStack(null);
transaction.commit();
return true;
case R.id.menu_option2:
//do something else;
return true;
default:
return super.onOptionsItemSelected(item);
}
}
または、メニューがフラグメントの1つの子である場合(再利用可能なコードのために必要です)、1つの方法は、そのホストアクティビティに、フラグメントによって定義されたインターフェイスを実装するように要求することです。コールバック。また、onOptionsItemSelected()
フラグメントクラス内のコールバックでは、このコールバックメソッドを呼び出すだけです。
一口のように聞こえますが、実際に行う必要があるのはいくつかのことだけです。これがあなたのフラグメントクラスであるふりをします
public static class FragmentA extends ListFragment {
OnSelectedListener mListener;
// Container Activity must implement this interface
public interface OnSelectedListener {
public void onSelected();
}
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//This is to ensure that the Activity has implemented the interface we set up above
try {
mListener = (OnSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnSelectedListener");
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
//...
switch (item.getItemId()) {
case R.id.menu_option1:
//do something
getActivity().onSelected();
return true;
case R.id.menu_option2:
//do something else;
return true;
default:
return super.onOptionsItemSelected(item);
}
}
...
}
次に、アクティビティで、次のようなものが表示されます。
public class MainActivity extends Activity implements FragmentA.onSelectedListener{
...
public void onSelected(){
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new YourFragmentClass();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.your_fragment_id, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
ユーザーがメニュー オプションを選択した場合、フラグメント B に関連付けられているビューを更新または再描画したいのですが、これを機能させる方法がわかりません
でonOptionsItemSelected()
、アクティビティにフラグメントのメソッドを呼び出して、ウィジェットを新しいコンテンツで更新させます。または、アクティビティで を実行しFragmentTransaction
てフラグメントを置き換えます (フラグメントが最初に を介して設定された場合FragmentTransaction
)。