0

この問題の解決策を考え出すのに問題があります。

基本的に、ActionBarにはたくさんのタブがあります。それぞれに触れると、前のタブのフラグメントが切り離され、新しいタブのフラグメントが、置換(まだインスタンス化されていない場合)またはアタッチ(インスタンス化されている場合)を使用して追加されます。私はこの方法をグーグルから入手したと思います、そしてそれは今までうまく機能していました。

タブのフラグメントを追加する例:

if(tab.getText().equals(context.getString(R.string.title_class_tab))) {         
        if(browser == null) {
            browser = CourseBrowserFragment.newInstance(false);
            fragmentTransaction.replace(leftContainerId, browser);
        } else {
            fragmentTransaction.attach(browser);
        }

        if(lessonViewer == null) {
            lessonViewer = LessonViewerFragment.newInstance(false);
            fragmentTransaction.replace(rightContainerId, lessonViewer);
        } else {
            fragmentTransaction.attach(lessonViewer);
        }
}

と削除:

if(tab.getText().equals(context.getString(R.string.title_class_tab))) {         
        if(browser != null) {
            fragmentTransaction.detach(browser);
        }
        if(lessonViewer != null) {
            fragmentTransaction.detach(lessonViewer);
        }
}

問題は、タブの1つに必要なレイアウトから発生します。基本的にはGmailアプリのようなものです。2つのフラグメント(たとえば、パネルAとパネルB)があり、ボタンを押すと、パネルAがスライドアウトし、パネルBがパネルAの古い位置にスライドし、新しい3番目のフラグメント(パネルC)が右からスライドインします。

これは正常に機能していましたが、スライドインFragmentTransactionをバックスタックに追加して、ユーザーが戻るボタンに触れると、パネルCがスライドして戻り、パネルAが戻るようにしました。繰り返しますが、Gmailのように。

ユーザーが別のタブに移動する場合を除いて、このトランザクションは引き続きバックスタックにあり、ユーザーが戻ると実行されます。断片はクレイジーな場所に行き着きます。私がする必要があるのは、ユーザーが別のタブに移動したときにバックスタックからそれを削除することです。これを行う方法はありますか?FragmentManagerでは、バックスタックから手動で削除することはできないようです。また、popBackStack()メソッドを使用すると、トランザクションが削除されるだけでなく、トランザクションが実行されます。ユーザーが移動したときに削除し、ユーザーが戻ったときに元に戻したい。

「getBackStackEntryAt」を使用してこのトランザクションの「バックスタックエントリ」を取得できると思いますが、ユーザーがタブに戻ったときに削除して元の場所に戻すことができないと、あまり良くありません。

私が考えることができる唯一の可能な解決策は、バックスタックを使用せず、代わりにonBackButtonPressedをオーバーライドすることです。そこから、必要に応じてトランザクションの逆を行うことができます。

助けてくれてありがとう、そして私が首尾一貫していないなら申し訳ありません。

4

1 に答える 1

0

これが解決策として認められるかどうかはわかりませんが、トランザクションをバックスタックに追加せず、ユーザーがスワイプまたは押し返したときに新しいトランザクションを実行するだけになりました。トランザクションは、アニメーションなどで元のトランザクションの逆を行っただけです。

戻るボタンを管理する方法は、パネル C を表示しているレイアウトにいた場合、ブール値を true に設定することです。ユーザーがスワイプしてパネル A レイアウトに戻るか、別の場所に移動すると、ブール値は false に設定されます。次に、Activity の onBackButtonPressed メソッドをオーバーライドし、ブール値が true の場合 (つまり、パネル C レイアウトにいる場合)、逆のトランザクションを実行します。それ以外の場合は、super.onBackButtonPressed() を呼び出します (つまり、標準の [戻る] ボタンの動作を実行します)。 .

于 2013-02-19T13:15:24.667 に答える