2012-07-03 36 views
25

我使用ActionBarSherlock(儘管我不認爲它很重要)。處理操作欄向上按鈕的正確方法?

我有一個主要活動和一個關於活動。我希望About活動通過其徽標顯示後退箭頭,並執行適當的動畫等。 我不知道如何正確地做到這一點。

目前,我已經在onOptionsMenuItemSelected下按下Up/Home按鈕時啓動了主要活動,但它很黑,並且不能正確工作。它播放錯誤的動畫,並且很難處理多任務。

我該如何設置正確?

下面是我的主要活動的一部分啓動關於:

Intent aboutIntent = new Intent(MainActivity.this, About.class); 
MainActivity.this.startActivity(aboutIntent); 

這裏是我的關於活動:

package com.stevenschoen.test; 

import android.content.Intent; 
import android.os.Bundle; 

import com.actionbarsherlock.app.SherlockActivity; 
import com.actionbarsherlock.view.MenuItem; 

public class About extends SherlockActivity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.about); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 

      case android.R.id.home: 
       // app icon in action bar clicked; go home 
       Intent intentHome = new Intent(this, MainActivity.class); 
       intentHome.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(intentHome); 
       return true; 

      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
} 

回答

12

發現我的問題的根源是在我前一陣子做清單的變化:我加入這行:

android:launchMode="singleInstance" 

所以我的主要活動將不會重新啓動。它更改爲:

android:launchMode="singleTask" 

解決了我的問題,我可以刪除所有onOptionsItemSelected東西。我知道出了什麼問題,Android應該能夠更好地處理這個問題,而且我是對的。檢查清單:P

+0

因此,使用已發佈的代碼將清空除主要活動(也是第一個活動)之外的所有活動? –

+0

Android文檔中提到「其他模式 - singleTask和singleInstance - 不適用於大多數應用程序,因爲它們導致用戶可能不熟悉的交互模型,並且與大多數其他應用程序有很大不同。」 http://developer.android.com/guide/topics/manifest/activity-element.html – user3533716

10

在你onCreate(Bundle savedInstanceState),在做

ActionBar actionBar = getSupportActionBar(); 
actionBar.setDisplayHomeAsUpEnabled(true); 

然後你onOptionsItemSelected(MenuItem item),do

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      // go to previous screen when app icon in action bar is clicked 
      Intent intent = new Intent(this, PreviousActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(intent); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+3

這正是我所擁有的。它不像谷歌的Up按鈕。它播放用於啓動新活動的動畫(而不是返回到最後一個)。 –

+0

...以及這對我很好。也許你應該發佈你的代碼?你正在導入正確的'MenuItem'嗎?你正在延長'SherlockActivity'嗎?我不知道還有什麼建議哈哈 –

+0

更新的原始帖子。 –

0

請確保您的android:minSdkVersion =「11」可以在清單文件中看到,Up圖標已包含在APK 11中。我已經做了一個小樣本,請嘗試下面的鏈接,它可能會可以幫助你只需要導入到你的工作空間

http://www.mediafire.com/?hktdvts7yyduwv1

+0

'up icon'可以在'Google支持'前用於'Api Level 11'之前。你將調用'getSupportActionBar()。setDisplayHomeAsUpEnabled(true)'。 – theblang

29

您是否也試過這個(取自Android的網站here):

在清單

,爲需要進入主每個活動X活動,請將此內容添加到代碼中:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    // Respond to the action bar's Up/Home button 
    case android.R.id.home: 
     NavUtils.navigateUpFromSameTask(this); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

,這給它的清單XML標籤:

<meta-data 
android:name="android.support.PARENT_ACTIVITY" 
android:value="com.activities.MainActivity" /> 

如果需要還具有相同的狀態上的主要活動,使用此代碼來代替:如果API

Intent intent = NavUtils.getParentActivityIntent(this); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
NavUtils.navigateUpTo(this, intent); 

是16或以上,您可以將parentActivityName的屬性添加到主要活動的路徑中,而不是元數據。

+0

如果它的一個片段?怎麼做 ? – user2056563

+0

@ user2056563類似的方式。您在需要該活動時使用「getActivity」,並在片段的「onCreate」內使用「setHasOptionsMenu(true)」。不要忘記爲片段的「onCreateOptionsMenu」方法調用「super.onCreateOptionsMenu」(我最後稱它爲「onCreateOptionsMenu」方法,但我認爲在開始時也可以)。 –

+0

'從Android 4.1(API級別16)開始,您可以通過指定元素中的android:parentActivityName屬性來聲明每個活動的邏輯父項。#取自http://developer.android.com/training/implementing-導航/ ancestral.html,所以我會糾正最後一點的信息 – Bhargav

5

對於誰只想回去以前的活動,這是最簡單的解決方案:

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      finish(); //this method close current activity and return to previous 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
8

您可以通過使用代碼或XML處理操作欄按鈕。

檢查這個代碼

,如果你想它以編程方式加入這一行的onCreate()方法

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

,並重寫這個方法onSupportNavigateUp()

@Override 
public boolean onSupportNavigateUp(){ 
finish(); 
return true; 
} 

OR非編程方式,您可以將清單文件的元素添加爲

<activity android:name="Current Activity" 
     android:parentActivityName="Activity you want to open"> 
    </activity> 

注:確保動作條不爲空。