簡體   English   中英

我是否需要包括默認的Intent才能返回上一個活動?

[英]Do I need to include a default Intent in order to return to the previous Activity?

我正在開發一個“待辦事項清單” Android應用程序(碰巧是用於一個類的分配,但這不是我要的問題,我已經嘗試了盡可能多的代碼)。 主屏幕顯示待辦事項列表,並在底部帶有一個按鈕,以打開“添加新待辦事項”屏幕。

初始待辦事項列表視圖

在“添加新待辦事項”屏幕上,有一個“取消”按鈕。

添加新的待辦事項視圖

相關的ToDoManagerActivity.java代碼段:

public void onCreate(Bundle savedInstanceState) {
        // Init and setup adapter, etc.

        footerView.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(ToDoManagerActivity.this, AddToDoActivity.class);
                startActivityForResult(intent, ADD_TODO_ITEM_REQUEST);
            }
        });

        // Attach the adapter to this ListActivity's ListView
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    log("Entered onActivityResult()");

    // Check result code and request code.
    // If user submitted a new ToDoItem
    // Create a new ToDoItem from the data Intent
    // and then add it to the adapter
}

相關的AddToDoActivity.java代碼段:

protected void onCreate(Bundle savedInstanceState) {
    // Initialize default view, handle other events, etc.

    final Button cancelButton = (Button) findViewById(R.id.cancelButton);
    cancelButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            setResult(RESULT_CANCELED, new Intent());
            finish();
        }
    });
}

上面的代碼有效。 以前,我曾在針對cancelButtononClick處理程序中嘗試過此cancelButton

public void onClick(View v) {
    finishActivity(RESULT_CANCELED);
}

當我單擊“取消”按鈕時,我可以看到在日志中已到達onActivityResult ,但是該屏幕並未恢復為ToDo列表主屏幕。

為什么上面的代碼不能使我返回上一屏幕,但是下面的代碼卻能使我返回上一屏幕? 我對任務堆棧/活動有什么誤解?

public void onClick(View v) {
    setResult(RESULT_CANCELED, new Intent());
    finish();
}

根據文檔

公眾無效表面()

活動完成且應關閉時調用此函數。 ActivityResult通過onActivityResult()傳播回發起您的任何人。

公共無效finishActivity(int requestCode)

強制完成您之前使用startActivityForResult(Intent,int)開始的另一個活動。

您應該調用finish()關閉當前活動,並finishActivity()關閉使用startActivityForResult(Intent intent, int requestCode)開始的另一個活動。 在當前活動上調用finishActivity()不會將其關閉。

同樣,沒有為setResult()創建新的Intent也是沒有意義的,因為您不會傳遞任何數據。 這樣做就足夠了:

setResult(RESULT_CANCELED);
finish();

從Android文檔:

public void finishActivity(int requestCode)強制完成您先前使用startActivityForResult(Intent,int)開始的另一個活動。

finishActivity不會完成當前活動,但會為使用requestCode調用的活動調用finish

如果您看一下finishActivity()文檔 ,它說它將強制完成以startActivityForResult()開始的活動,但是您必須傳入用於啟動其他活動的請求代碼。 在您的情況下,它將是ADD_TODO_ITEM_REQUEST

這可能不是您要使用的API。 您的第二種方法更干凈,因為您無需強制關閉子項活動,但可以正常方式完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM