0

BaseActivity()多くのアクティビティを持つBaseFragment()と多くのフラグメントを持つ があります。各アクティビティには 2 ~ 3 個のフラグメントが含まれており、すべてのフラグメント (すべて - すべてのアプリ画面を意味します) からの各 onBackPressed を処理する汎用メソッドを作成する必要がありますが、このメソッドは含まれている必要がありますBase Fragment()(すべてのフラグメントがそれを拡張します)。OnBackPressed()fromBaseActivity()genericMethod()fromを結び付ける一種のリスナーが必要になると思いますBaseFragment()

アドバイスありがとう。

4

5 に答える 5

1

@コレツキ:

onBackPressed()

ユーザーが戻るキーを押したことをアクティビティが検出したときに呼び出されます。デフォルトの実装は単に現在のアクティビティを終了しますが、Android のデフォルトのユーザー エクスペリエンスを変更することは推奨されていないため、デフォルトの [戻る] ボタン アクションをオーバーライドしながら、これをオーバーライドして必要なことを行うことができます。

Override the onBackPressed()メソッドを呼び出して、この関数内でアクションを実行します。

@Override
    public void onBackPressed() {
        // Write your code here

        super.onBackPressed();
    }

AndroidフラグメントにonBackPressed()を実装するには?

于 2015-08-26T12:27:13.630 に答える
1

私の質問で述べたように、最も簡単な解決策は、私の場合、少し「ハードプログラミング」することです。BaseFragment()すべての画面からのすべてのバックプレスアクションを処理するメソッドが必要BaseFragment()です。

@Sharp Edgeソリューションは受け入れられるかもしれませんが、単一のメソッドを追加するだけで、拡張するすべての単純なアクティビティがそれを気にしない場合SimpleActivity()、拡張するそれぞれでそれを処理するのはなぜですか。BaseActivity()BaseFragment()BaseActivity()

@escape-llc ソリューションは混乱しており、予想されるものではありません... EventBusまたはOttoを使用して簡単に処理しonResume()、各フラグメントからに送信できますSimpleActivity()。実際に開いているフラグメントを受け取り、onBackPressed()が実行されたときにどのようなアクションを実行するか...

したがって、私が言ったように、私の解決策は、単純なジェネリック メソッドを使用することですBaseFragment()

   public void doBackBtnPressedAction(View view) {
    view.setFocusableInTouchMode(true);
    view.requestFocus();

    view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {

                    //logical part, in my case some server requests 

                    return true;
                }
            }
            return false;
        }
    });
}
于 2015-08-27T08:01:06.357 に答える
0

これは、フラグメントに webview があり、webview の onBackPressed を処理したいときに処理した方法ですか?

public class Tab2 extends Fragment {
ProgressBar progress;
WebView x;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v =inflater.inflate(R.layout.tab_2,container,false);
    x = (WebView)v.findViewById(R.id.webView);
    x.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if(event.getAction() == KeyEvent.ACTION_DOWN)
            {
                WebView web = (WebView)v;
                switch (keyCode)
                {
                    case KeyEvent.KEYCODE_BACK:
                        if(web.canGoBack())
                        {
                            web.goBack();
                            return  true;
                        }
                        break;
                }
            }
            return false;
        }
    });
于 2015-08-26T12:00:23.423 に答える
0

このためのカスタムActivityクラスを作成する必要があります..そしてそれをオーバーライドしてonBackPressed()、ロジックを追加する. 次に、フラグメントが使用されている場所Activityで、この CustomActivity の関連するサブクラスを作成する必要があることを確認してください。

そのため、どのFragmentユーザーでonBackPressed()あっても、そのアクティビティが呼び出されて追加super()され、基本クラスのメソッドが呼び出され、コードが各フラグメントで実行されます。

例:

MyCustomActvity extends FragmentActivity{
  @Override
  public void onBackPressed(){

   // your logic here
   super.onBackPressed();
   }


}

これで、フラグメントには少なくとも 1 つのベース アクティビティが必要であることがわかったので、そのアクティビティのonBackPressed()

MyActivity extends MyCustomActivity{

 // 3 fragments are called/replaced from this activity

 // other code

    @Override
    public void onBackPressed(){
     super.onBackPressed();  // it will invoke base class method and your code

    }


}

MyCustomActivityフラグメントを使用するものを拡張するだけです。

于 2015-08-26T12:01:36.103 に答える
0

これは、一般的な方法でそれを処理するための優れた方法です。現在、すべてのフラグメントベースのアプリで使用しています。

まず、実装するフラグメントのインターフェースを作成します。これは、戻るキーを処理するかどうかを表します。そうでない場合は、インターフェースを実装しないでください。

public interface IHandleBackPressed {
    boolean handleBackPressed(Activity ax);
}

onBackPressedこれは基本的に、アクティビティのメソッドのプロキシです。

次に、Activity.onBackPressedこのボイラープレートでメソッドをオーバーライドします。

@Override
public void onBackPressed() {
    final Fragment fx = getFragmentManager().findFragmentById(R.id.content);
    if(fx != null) {
        if(fx instanceof IHandleBackPressed) {
            final IHandleBackPressed ihbp = (IHandleBackPressed)fx;
            if(ihbp.handleBackPressed(this)) {
                // we handled it
                return;
            }
        }
    }
    // onBackPressed unhandled by us
    super.onBackPressed();
}

これは常に同じである可能性があります。複数のフラグメント エリアがある場合は、各フラグメント エリアに対してシーケンスを繰り返すだけです。super.onBackPressed追加のロジックがある場合は、それをシステムに引き継ぐために呼び出す前または後に統合します (つまり、アクティビティを終了します)。

でできることのサンプルを次に示しFragmentます。この例では を使用しWebView、バック キーを使用して のバック スタックを管理しますWebView

public class BrowseUrlFragment extends Fragment implements IHandleBackPressed {
    WebView wv;
    public boolean handleBackPressed(Activity ax) {
        if(wv != null && wv.canGoBack()) {
            wv.postDelayed(goback, 150);
            return true;
        }
        return false;
    }
}
于 2015-08-26T12:28:46.790 に答える