0

TabActivity と ActivityGroup (現在は非推奨) を使用してずっと前にプロジェクトを作成しました。

質問は簡単かもしれませんが、まず流れを明確にしたいと思います。Tabhost には 4 つのタブがあります。次のコードを使用して、アクティビティのバックスタックを追跡しました。

MyActivityGroup.java

public class MyActivityGroup extends ActivityGroup {
    public static Stack<String> stack;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (stack == null) {
        stack = new Stack<String>();
    }

    push("1stStackActivity", new Intent(this, Home.class));

}

@Override
public void finishFromChild(Activity child) {
    pop();
}

@Override
public void onBackPressed() {

    pop();

}

public void push(String id, Intent intent) {
    Window window = getLocalActivityManager().startActivity(id,
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
    if (window != null) {
        stack.push(id);
        setContentView(window.getDecorView());
    }
}

public void pop() {
    if (stack.size() == 1) {

        finish();
    }

    LocalActivityManager manager = getLocalActivityManager();
    manager.destroyActivity(stack.pop(), true);
    if (stack.size() > 0) {
        Intent lastIntent = manager.getActivity(stack.peek()).getIntent()
                .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        Window newWindow = manager.startActivity(stack.peek(), lastIntent);
        setContentView(newWindow.getDecorView());
    }
}
}

ここに注意してください:

push("1stStackActivity", new Intent(this, Home.class));

Home.class は、 my.class に読み込まれる最初のアクティビティHOME TABです。

これが私の流れと質問を示す画像です。

ここに画像の説明を入力

Activity Aボタンをクリックしたときから(図アクティビティ A を参照)。こんな感じで新しい活動を始めます

Intent intent = new Intent();
            intent.setClass(getParent(), BookOverView.class);

            MyActivityGroup activityStack = (MyActivityGroup) getParent();
            activityStack.push("2ndStackActivity", intent);

Activity Bこれにより、現在のmy も読み込まれHOME TAB、アクティビティがスタックにプッシュされます。

アクティビティ B から任意のリスト項目をクリックすると、同じタブで上記と同じコードで新しいアクティビティが開始されます(3rdStackActivity)。それは私の始まりActivity cです; キーを押すと正常に動作します(つまり、「Activity C」->「ACTIVITY B」->「ACTIVITY A」から)。

質問

立っている間(図のアクティビティ C を参照)activity Cをクリックすると、最初のアクティビティ (アクティビティ A) に戻るはずです。Home TAB

ここに私のHOME TABクリックイベントがあります

getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                                    \\ Check If stack has at least more then one activity loaded.
                if (MyActivityGroup.stack.size() > 1) {

                                     //My code to clear the stack and load the 1st Activity goes here


                                     // I tried Here to clear my stack 
                                     // But not sccessfull



                }

            } else {

                getTabHost().setCurrentTab(0);

            }
        }
    });

スタックをクリアして最初のホーム クラスを開始しようとしているときに問題が発生しました。

ここに、TabActivity を拡張する私の MainActivity.java があります

public class MainActivity extends TabActivity {

Context context = MainActivity.this;

TabHost tabHost;
TabSpec spec;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tabHost = getTabHost();
    // Android tab
    tabHost.addTab(tabHost
            .newTabSpec("Home")
            .setIndicator("Home",
                    getResources().getDrawable(R.drawable.home))
            .setContent(
                    new Intent(this, MyActivityGroup.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

    tabHost.addTab(tabHost
            .newTabSpec("Now Reading")
            .setIndicator("Now Reading",
                    getResources().getDrawable(R.drawable.now_reading))
            .setContent(
                    new Intent(this, NowReadingActivityGroup.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

    tabHost.addTab(tabHost
            .newTabSpec("Favorites")
            .setIndicator("Favorites",
                    getResources().getDrawable(R.drawable.favorites))
            .setContent(
                    new Intent(this, FavoriteActivityGroup.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

    tabHost.addTab(tabHost
            .newTabSpec("Profile")
            .setIndicator("Profile",
                    getResources().getDrawable(R.drawable.profile))
            .setContent(
                    new Intent(this, ProfileActivityGroup.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

    tabHost.setCurrentTabByTag("Home");

    tabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {

            Toast.makeText(context, "Changed", Toast.LENGTH_SHORT).show();

        }
    });

}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();

    getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                if (MyActivityGroup.stack.size() > 1) {


                }

            } else {

                getTabHost().setCurrentTab(0);

            }
        }
    });

}



}

編集2

onTabClick イベントでこのようにしました

        if (MyActivityGroup.stack.size() > 1) {

                    while (!MyActivityGroup.stack.isEmpty()) {
                        MyActivityGroup.stack.pop();
                    }

                    Intent homeIntent = new Intent();
                    homeIntent.setClass(MainActivity.this, Home.class);
                    MyActivityGroup activityStack = (MyActivityGroup) getCurrentActivity();

                    activityStack.push("HomeActivity", homeIntent);
                }

            } else {

                getTabHost().setCurrentTab(0);

            }

これにより、最初のアクティビティが読み込まれ、アクティビティ スタックもクリアされます。しかし問題は、タブを他のタブに変更し、ホームタブに戻って戻るボタンを押すたびにクラッシュすることです。こちらが丸太猫。

05-31 14:15:42.769: E/AndroidRuntime(550): FATAL EXCEPTION: main
05-31 14:15:42.769: E/AndroidRuntime(550): java.lang.NullPointerException
05-31 14:15:42.769: E/AndroidRuntime(550):  at my.islamic.books.lib.app.MyActivityGroup.pop(MyActivityGroup.java:120)
05-31 14:15:42.769: E/AndroidRuntime(550):  at my.islamic.books.lib.app.MyActivityGroup.finishFromChild(MyActivityGroup.java:30)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.finish(Activity.java:3259)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.onBackPressed(Activity.java:1920)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.onKeyUp(Activity.java:1898)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.KeyEvent.dispatch(KeyEvent.java:1280)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.dispatchKeyEvent(Activity.java:2078)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.dispatchKeyEvent(Activity.java:2073)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.widget.TabHost.dispatchKeyEvent(TabHost.java:278)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.dispatchKeyEvent(Activity.java:2073)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.os.Looper.loop(Looper.java:123)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.ActivityThread.main(ActivityThread.java:3683)
05-31 14:15:42.769: E/AndroidRuntime(550):  at java.lang.reflect.Method.invokeNative(Native Method)
05-31 14:15:42.769: E/AndroidRuntime(550):  at java.lang.reflect.Method.invoke(Method.java:507)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-31 14:15:42.769: E/AndroidRuntime(550):  at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

HomeTab クリックイベントでこのようにしました

getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                Log.i("not Null", "Not null");

                if (MyActivityGroup.stack.size() > 1) {

                    while (!MyActivityGroup.stack.isEmpty()) {
                        MyActivityGroup.stack.pop();
                    }

                    Intent homeIntent = new Intent();
                    homeIntent.setClass(MainActivity.this, Home.class);
                    MyActivityGroup activityStack = (MyActivityGroup) getCurrentActivity();

                    activityStack.push("HomeActivity", homeIntent);
                }

            } else {

                getTabHost().setCurrentTab(0);

            }

        }

    });

また、tabchange listner では、自分の activityGroup スタックもクリアする必要があります。だから私はこれが好きです

tabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {

            Toast.makeText(context, "Changed", Toast.LENGTH_SHORT).show();
            while (!MyActivityGroup.stack.isEmpty()) {

                if (MyActivityGroup.stack.size()==1) {
                    break;
                }
                MyActivityGroup.stack.pop();
            }


        }
    });

ああ、ついに私は頭のそれぞれの丸薬を見つけました:)

于 2013-05-31T10:46:49.860 に答える