94

AB、およびCという3 つのタブを含む、タブ付きの Actionbar/viewpager レイアウトがあります。タブCタブ (フラグメント) で、フラグメントDなどの別のフラグメントを追加しています。と

 DFragment f= new DFragment();
 ft.add(android.R.id.content, f, "");
 ft.remove(CFragment.this);
 ft.addToBackStack(null);
 ft.commit();

DFragment の onResume のアクションバーを変更して、ボタンを追加します。

ActionBar ab = getActivity().getActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
ab.setDisplayHomeAsUpEnabled(true);
ab.setDisplayShowHomeEnabled(true);

DFragment で、ハードウェア (電話) の [戻る] ボタンを押すと、CFragment が選択された元のタブ (ABC) レイアウトに戻ります。アクションバーアップボタンでこの機能を実現するにはどうすればよいですか?

4

10 に答える 10

190

このコードを実装OnBackStackChangedListenerしてフラグメント アクティビティに追加します。

@Override
public void onCreate(Bundle savedInstanceState) {
    //Listen for changes in the back stack
    getSupportFragmentManager().addOnBackStackChangedListener(this);
    //Handle when activity is recreated like on orientation Change
    shouldDisplayHomeUp();
}

@Override
public void onBackStackChanged() {
    shouldDisplayHomeUp();
}

public void shouldDisplayHomeUp(){
   //Enable Up button only  if there are entries in the back stack
   boolean canGoBack = getSupportFragmentManager().getBackStackEntryCount()>0;
   getSupportActionBar().setDisplayHomeAsUpEnabled(canGoBack);
}

@Override
public boolean onSupportNavigateUp() {
    //This method is called when the up button is pressed. Just the pop back stack.
    getSupportFragmentManager().popBackStack();
    return true;
}
于 2013-12-01T16:45:01.597 に答える
43

わかった。ホスティングアクティビティでonOptionsItemSelectedをオーバーライドし、バックスタックをポップアップするだけです。

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home: {
            FragmentManager fm = getSupportFragmentManager();
            if (fm.getBackStackEntryCount() > 0) {
                fm.popBackStack();
                return true;
            }
            break;
        }
    }
    return super.onOptionsItemSelected(item);
}

以下の回答で説明されているように、電話しgetActionBar().setDisplayHomeAsUpEnabled(boolean);てください。getActionBar().setHomeButtonEnabled(boolean);onBackStackChanged()

于 2012-10-31T18:48:07.337 に答える
18

親アクティビティが 1 つあり、このアップ ボタンを戻るボタンとして機能させたい場合は、次のコードを使用できます。

これをメイン アクティビティ クラスの onCreate に追加します。

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            int stackHeight = getSupportFragmentManager().getBackStackEntryCount();
            if (stackHeight > 0) { // if we have something on the stack (doesn't include the current shown fragment)
                getSupportActionBar().setHomeButtonEnabled(true);
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            } else {
                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                getSupportActionBar().setHomeButtonEnabled(false);
            }
        }

    });

次に、次のように onOptionsItemSelected を追加します。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getSupportFragmentManager().popBackStack();
            return true;
     ....
 }

私は一般的にこれを常に使用しており、かなり合法的なようです

于 2014-07-22T03:31:01.910 に答える
11

戻るボタンのように上ボタンで戻ることができます。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            super.onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}
于 2015-05-23T16:29:29.310 に答える
8

この質問は古いことは知っていますが、誰か(私のような)もそれを必要としている可能性があります。

Activity がAppCompatActivityを拡張する場合、より単純な (2 ステップの) ソリューションを使用できます。

1 - 非ホーム フラグメントを追加するときはいつでも、フラグメント トランザクションをコミットした直後にアップ ボタンを表示します。このような:

    // ... add a fragment
    // Commit the transaction
    transaction.commit();

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

2 - 次に、UP ボタンを押すと非表示になります。

@Override
public boolean onSupportNavigateUp() {
    getSupportActionBar().setDisplayHomeAsUpEnabled(false);        
    return true;
}

それでおしまい。

于 2016-06-05T19:56:41.410 に答える
8

Roger Garzon Nietosohailaziz の回答を組み合わせて使用​​しました。私のアプリには、単一の MainActivity と、それに読み込まれるフラグメント A、B、C があります。私の「ホーム」フラグメント (A) は OnBackStackChangedListener を実装し、backStack のサイズをチェックします。1 未満の場合は、UP ボタンを非表示にします。フラグメント B と C は常に戻るボタンをロードします (私の設計では、B は A から起動され、C は B から起動されます)。MainActivity 自体は、UP ボタンのタップ時にバックスタックをポップするだけで、フラグメントが呼び出すボタンを表示/非表示にするメソッドがあります。

主な活動:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            getSupportFragmentManager().popBackStack();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

public void showUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
public void hideUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); }

fragmentA (FragmentManager.OnBackStackChangedListener を実装):

public void onCreate(Bundle savedinstanceSate) {
    // listen to backstack changes
    getActivity().getSupportFragmentManager().addOnBackStackChangedListener(this);

    // other fragment init stuff
    ...
}

public void onBackStackChanged() {
    // enable Up button only  if there are entries on the backstack
    if(getActivity().getSupportFragmentManager().getBackStackEntryCount() < 1) {
        ((MainActivity)getActivity()).hideUpButton();
    }
}

フラグメント B、フラグメント C:

public void onCreate(Bundle savedinstanceSate) {
    // show the UP button
    ((MainActivity)getActivity()).showUpButton();

    // other fragment init stuff
    ...
}
于 2015-09-15T15:55:21.847 に答える
5

これは私にとってはうまくいきました。たとえば、onSupportNavigateUp と onBackPressed をオーバーライドします (Kotlin のコード)。

override fun onBackPressed() {
    val count = supportFragmentManager.backStackEntryCount
    if (count == 0) {
        super.onBackPressed()
    } else {
        supportFragmentManager.popBackStack()
    }
}

override fun onSupportNavigateUp(): Boolean {
    super.onSupportNavigateUp()
    onBackPressed()
    return true
}

フラグメントで、上矢印を表示すると

activity.supportActionBar?.setDisplayHomeAsUpEnabled(true)

それをクリックすると、前のアクティビティに戻ります。

于 2016-10-31T13:14:24.417 に答える