Back button behavior with tabs and ActivityGroup

拈花ヽ惹草 提交于 2019-12-09 03:52:50

问题


I have an Activity (Main) which shows tabs like this:

private void initTabs(){
    mTabHost = getTabHost(); // The activity TabHost

    Intent intent;
    intent = new Intent().setClass(this, MyGroup.class);
    setupTab(intent, "tab");
}

private void setupTab(Intent intent, final String tag) {
    View tabview = createTabView(mTabHost.getContext(), tag);
    TabSpec setContent = mTabHost.newTabSpec(tag).setIndicator(tabview).setContent(intent);
    mTabHost.addTab(setContent);
}

private static View createTabView(final Context context, final String text) {
    View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null);

    ((TextView) view.findViewById(R.id.tabsText)).setText(text);
    return view;
}

The MyGroup class is an ActivityGroup, which does the following:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    View view = getLocalActivityManager().startActivity("activityA", new Intent(this, ActivityA.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
    this.setContentView(view);

            state = A;
}

public void openB() {
    Intent i = new Intent(this, ActivityB.class);

    View view = getLocalActivityManager().startActivity("activityB", i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
    this.setContentView(view);
            state = B;
}

So Main has a tab with a MyGroup. The MyGroup starts with ActivityA and then goes to ActivityB. When I press the back button in ActivityB, I want to go back to ActivityA, and on back press in ActivityA I want to close the app.

This is how I've done that. In ActivityB:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    System.out.println("ActivityB PRESSED");
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        MyGroup mg = (MyGroup) getParent();
        return mg.onKeyDown(keyCode, event);
    }
    return super.onKeyDown(keyCode, event);
}

In ActivityA the same:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        System.out.println("ActivityA PRESSED");
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            MyGroup mg = (MyGroup) getParent();
            return mg.onKeyDown(keyCode, event);
        }
        return super.onKeyDown(keyCode, event);
    }

Now, in MyGroup:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            System.out.println("MG PRESSED");   
                if (state == A)
                return false;
            else if (state == B) {
            setContentView(getLocalActivityManager().startActivity("activityA", new Intent(this, ActivityA.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView());
                state = A;
                return true;
        }

        return false;
        }
        return super.onKeyDown(keyCode, event);
    }

Finally, in Main, just a system.out:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    System.out.println("MAIN PRESSED");
    return super.onKeyDown(keyCode, event);
}

Now this is my current behavior, which I don't want:

  • When app started, I'm in ActivityA. Backbutton -> app closes. OK.
  • When app started, ActivityA -> ActivityB -> Back button -> ActivityA. OK.
  • When app started, ActivityA -> ActivityB -> Back -> ActivityA -> ActivityB -> Back -> app closes. NOT OK!

Apparently, the second time ActivityB is shown, the back button is being handled by Main, instead of ActivityB or MyGroup.

How can I fix this?

EDIT

I've added an ActivityC. It seems like behaviour in the first two activities is normal, and from the third on, the Main activity handles the button press.

So A -> B -> A is handled by A -> B -> Main

and A -> B -> C is handled by A -> B -> Main.


回答1:


Override public void onBackPressed() in your activity and handle the back button click yourself. Calling super.onBackPressed(); will affect the standard behaviour of back button press (also exit your app)




回答2:


So I found the answer.

I have an admob adview in my Main, which seems the cause of this problem. This is the xml:

    <?xml version="1.0" encoding="utf-8"?>
    <TabHost
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"    
                    android:padding="0dp">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true" />
        <com.google.ads.AdView
            android:id="@+id/adView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            ads:adUnitId="@string/adkey"
            ads:adSize="BANNER"
            ads:loadAdOnCreate="false"
            android:layout_alignParentBottom="true" 
            android:focusable="false"/>
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_above="@id/adView"
            android:layout_below="@android:id/tabs" />

    </RelativeLayout>
</TabHost>

When I remove the adview, the problem doesn't occur.

Now to solve this, I've changed the xml into this:

<?xml version="1.0" encoding="utf-8"?>
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="0dp">
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true" />

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_below="@android:id/tabs" />
        </RelativeLayout>
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <com.google.ads.AdView
                android:id="@+id/adView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                ads:adUnitId="@string/adkey"
                ads:adSize="BANNER"
                ads:loadAdOnCreate="false"
                android:layout_alignParentBottom="true"
                android:focusable="false" />
        </RelativeLayout>
    </FrameLayout>
</TabHost>


来源:https://stackoverflow.com/questions/7174624/back-button-behavior-with-tabs-and-activitygroup

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!