14

2 つのフラグメントを持つ単純なアプリがあり、横向きモードでは両方のフラグメントが並べて表示され、縦向きではフラグメント A が表示され、オプションを選択すると、フラグメント B を表示するアクティビティが開始されます。ポートレート モードでフラグメント B を表示しているときに、ユーザーがメニュー オプションを選択すると、フラグメント B に関連付けられているビューを更新または再描画したいのですが、これを機能させる方法がわかりません。getView メソッドと getLayoutInflater メソッドを試しましたが、新しいビューを作成していると思うため、画面は変わりません。また、フラグメント A への参照を取得しようとしましたが、そのルーチンを呼び出して新しいフラグメントを構築し、フラグメント B を置き換えることができると考えていましたが、表示されていないため参照を取得できませんでした。本当に必要なのは、新しいビューを膨らませるために onCreateView メソッドを強制的に再度呼び出すことですが、これを行うためにいくつかの方法を試しましたが、onCreateView を再度呼び出すことはできません。これについて何か考えはありますか?

4

2 に答える 2

9

を実行し、メソッド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();
}
}
于 2011-10-17T18:03:20.053 に答える
1

ユーザーがメニュー オプションを選択した場合、フラグメント B に関連付けられているビューを更新または再描画したいのですが、これを機能させる方法がわかりません

onOptionsItemSelected()、アクティビティにフラグメントのメソッドを呼び出して、ウィジェットを新しいコンテンツで更新させます。または、アクティビティで を実行しFragmentTransactionてフラグメントを置き換えます (フラグメントが最初に を介して設定された場合FragmentTransaction)。

于 2011-10-17T18:02:24.187 に答える