Androidは別のフラグメントからダイアログフレグメントを再表示します
-
26-12-2019 - |
質問
フラグメントを使用しているアプリケーションを持っています。セットアップはそのようなものです。
主な活動負荷は、断片活動を親活動の右側にロードする
- フラグメントから、ユーザーのリストを表示するダイアログフレグメントを起動します。
- ダイアログからリスト内のいずれかのユーザをクリックすると、ユーザダイアログフレグメンテスト.hide()のリストを非表示にし、ユーザの詳細を含む新しいダイアログフレグメントを表示します。
これはすべてうまく機能します。ただし、詳細ダイアログFragmentの[閉じる]ボタンをクリックすると、そのダイアログが閉じられ、ユーザーのリストダイアログのリストを再表示します。
私はこれが続くのがやや難しいことを理解しています。 誰かが私を助けるかもしれない洞察を持っていますか?
更新
ダイアログフレグメントを表示するために使用するコードは次のとおりです。
MyDialogFragment dialog = new MyDialogFragment();
dialog.show(getFragmentManager(), "MyDialogFragment");
.
ダイアログの断片に1回、それを非表示にして詳細フラグメントを表示する場合は
dialog.hide();
MyDetailsFragment details = new MyDetailsFragment();
details.show(getFragmentManager(), "MyDetailsFragment");
.
基本的に私は詳細を閉じたときに上記のダイアログを再表示できる必要があります。
解決
フラグメントトランザクションが実行されると、ダイアログの照会時に逆にすることができるバックスタックに追加できます。
フラグメントトランザクションを開始し、 dialogfragment.show(fragmenttransactionトランザクション、文字列タグ) FragmentTransaction
をパラメータとして取得します。それはダイアログを表示し、渡されたトランザクションにフラグメントを追加してからトランザクションをコミットします。後でダイアログが閉じられると、DialogFragment
自体がトランザクションをポップするのを大切にします。
ダイアログFragment Docs に続く最初のサンプルに従うことができます。
これはワークコードです:
public void launchMyDialog(View v) {
// DialogFragment.show() will take care of adding the fragment
// in a transaction. We also want to remove any currently showing
// dialog, so make our own transaction and take care of that here.
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("mydialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
MyDialogFragment dialog = new MyDialogFragment();
dialog.show(ft, "mydialog");
}
public static class MyDialogFragment extends DialogFragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_main, container, false);
Button b = (Button) v.findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("mydialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
MyDetailsFragment dialog = new MyDetailsFragment();
dialog.show(ft, "mydialog");
}
});
return v;
}
}
.