BackButton不会调用历史堆栈中的最后一个活动

时间:2011-06-22 18:26:10

标签: android android-layout

我的活动后退按钮出现此错误。所有活动都有这个问题。当我按下Back Button时,它进入主屏幕,而不是堆栈中的最后一次活动。我已经推出了一条Log消息,但在某些活动中它不会在LogCat上打印它,在此处发布的此活动中它会打印日志。但看起来有些活动并没有进入方法内部。

我的应用程序中有三个选项卡,其中一个扩展ActivityGroup而不是活动。但是我不认为这个问题,我已经删除了这个标签,并且它一直在发生。

所以我的问题是,如何解决它,如何进入上一次活动而不是进入主屏幕?

实际上它会进入调用它的最后一个屏幕。如果我在主屏幕上调用它,那么如果我在主屏幕上调用它,我会在其中放置快捷方式和小部件进入此屏幕。 对于我在docs中读到的内容,它应该转到历史堆栈的最后一个,这意味着这个屏幕在堆栈中,但没有我的活动。对吗?

我试过这个,但不适用于所有活动。它一直在主屏幕上。我不知道它能是什么。

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
                finish();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

我也试过onBackPressed()方法,但没有。而且,我没有调用完成,而是尝试了一个新的意图并调用了一些活动明确,但也没有。

我不能把我所有的活动放在这里,因为很多 但是这里有一个,也许如果有什么用,我可以在别人身上实施。感谢。

public class MyActivity extends Activity {

    private ListView listview;
    private ImageView imgView;
    private Resources res;
    private Drawable transition;
    private SimpleCursorAdapter adapter;
    private DataHandlerDB handler;
    private SQLiteDatabase db;
    private OpenHelper helper;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);          
        helper = new OpenHelper(this);
        db = helper.getWritableDatabase();
        setBasicContent();

    }

    @Override
    public void onStart() {

        super.onStart();
        helper = new OpenHelper(this);
        db = helper.getWritableDatabase();
        setBasicContent();

    }

    @Override
    public void onDestroy() {

        super.onDestroy();
        DataHandlerDB.selectTopCalls(this).close();
        db.close();
        helper.close();

    }

    @Override
    public void onPause() {

        super.onPause();

    }

    @Override
    public void onStop() {

        super.onStop();
        DataHandlerDB.selectTopCalls(this).close();
        db.close();
        helper.close();

    }

    @Override
    protected void onResume() {

        super.onResume();
        setBasicContent();

    }


    public void setBasicContent() {

        listview = (ListView) findViewById(R.id.list_view);

        Cursor c = DataHandlerDB.selectTopCalls(this);      

        c.moveToFirst();

        startManagingCursor(c);     

        adapter = new SimpleCursorAdapter(this, R.layout.list_item, c,
                new String[] { DataHandlerDB.CONTACT_NAME_COL,
                        DataHandlerDB.CONTACT_NUMBER_COL,
                        DataHandlerDB.CONTACT_DURATION_COL,
                        DataHandlerDB.CONTACT_DATE_COL }, new int[] {
                        R.id.contact_name, R.id.phone_number, R.id.duration,
                        R.id.date });       

        listview.setAdapter(adapter);
    }
}

以下是扩展ActivityGroup的活动,其调用如下:

tabHost.addTab(tabHost.newTabSpec("three").setIndicator("Filter Options", 
                res.getDrawable(R.drawable.filteroptionsiconfile))
                .setContent(new Intent(this, FilterOptionsGroup.class)));

FilterOptionsGroup.java

public class FilterOptionsGroup extends ActivityGroup {

    public static FilterOptionsGroup group;
    private ArrayList<View> history;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        this.history = new ArrayList<View>();
        group = this;

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

        replaceView(view);

    }

    public void replaceView(View v) {
        // Adds the old one to history
        history.add(v);         
        // Changes this Groups View to the new View.
        setContentView(v);
    }

}

4 个答案:

答案 0 :(得分:1)

如果您的所有活动都封装在选项卡主机中,并且它们都在选项卡中托管,那么它们并不真正位于堆栈中。它们位于前景视图中,即标签主机屏幕,后退按钮将您转到上一个应用程序。

答案 1 :(得分:0)

调用此活动的活动是否可能自行完成?如果不覆盖onkeydown,则默认行为是处理后退按钮。请注意,您将backButtonPressed与onBackPressed混淆。使用@Override注释确保您覆盖正确的方法......

来自Android的Activity源

public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (getApplicationInfo().targetSdkVersion
                >= Build.VERSION_CODES.ECLAIR) {
            event.startTracking();
        } else {
            onBackPressed();
        }
        return true;
    }
<snip>

...

所以,你真的不需要做任何事情。

答案 2 :(得分:0)

检查您的清单,您可能已将android:noHistory设置为true

答案 3 :(得分:0)

试着打电话 onKeyDown方法开头的super.onKeyDown(keyCode, event);。 我有类似的问题,这是一个解决方案