2011-06-22 49 views
4

我在我的活動中使用後退按鈕時出現此錯誤。所有活動都有這個問題。當我按下後退按鈕時,它將進入主屏幕,而不是在堆棧中進行最後的活動。我已經提出了一條日誌消息,但在某些活動中,它不會在LogCat上打印它,在此處發佈的活動中它會打印日誌。但是看起來有些活動不在方法內部。BackButton不會調用歷史堆棧中的最後一個活動

我的應用程序中有三個選項卡,其中一個擴展爲ActivityGroup而不是活動。但我不認爲它是這個問題,我已經刪除了這個標籤,並且它一直在發生。

所以我的問題是,我該如何解決這個問題,我如何讓它進入最後的活動,而不是去主屏幕?

實際上,它進入了它被調用的最後一個屏幕。如果我在主屏幕上調用它,則會轉到此屏幕,如果我在主屏幕上調用它,則會將快捷方式和小部件放到此屏幕中。 對於我在文檔中讀到的內容,它應該到達歷史堆棧中的最後一個,這意味着此屏幕在堆棧中,但沒有我的活動。對?

我試圖把這個,但不適用於所有活動。它繼續前往主屏幕。我不知道它會是什麼。

@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); 
    } 

} 
+0

當你開始新的活動時,你總是調用finish()嗎? –

+0

號我應該叫它? – rogcg

+0

不,你不應該。只是爲了確保你沒有破壞堆棧中的活動。嘗試消除onBackPressed()和/或onKeyDown()。它工作嗎?也許你應該發佈擴展ActivityGroup的活動。 –

回答

1

如果你所有的活動都封裝在一個接頭主機之內,並且在標籤那麼他們是不是真的坐在堆棧中的所有主機。它們位於標籤主屏幕的前景視圖內,後退按鈕會將您放到前一個應用程序中。

+0

我很確定這是怎麼回事。我應該做些什麼? – rogcg

+0

你可以在具有標籤主機的類中創建一個變量,並捕獲標籤主機標籤的位置(我不記得標識符是什麼,只是1,2,3),並在後退按鈕中按changeTab(# )。我不確定這是否完全清楚,如果您仍然感到困惑,請告訴我,我可以爲您編寫代碼 – Mutmatt

0

是調用此活動活動也許完成我自行宣佈?如果您不覆蓋onkeydown,則默認行爲是處理後退按鈕。請注意,您將backButtonPressed與onBackPressed混淆。使用@Override批註,以確保你覆蓋了正確的方法...

從Android源活動

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> 

......

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

+0

該實現沒有解決。 – rogcg

0

檢查清單,你可能已經設置了android:noHistorytrue

+0

我沒有在我的清單文件上。我已經在這裏添加了並且它一直在發生。 – rogcg

0

嘗試在onKeyDown方法的開頭調用 super.onKeyDown(keyCode, event);。 我有類似的問題,這是一個解決方案