2014-11-05 78 views
-2

我有這種類型的代碼開關/箱與R.id.XXXX And​​roid中不起作用

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menu_sign_out_all: 
     doHardShutdown(); 
     return true; 
    case R.id.menu_add_account: 
    // showExistingAccountListDialog(); 
     return true; 
    case R.id.menu_settings: 
     Intent sintent = new Intent(this, SettingActivity.class); 
     startActivityForResult(sintent,0); 
     return true; 
    case R.id.menu_import_keys: 
     importKeyStore(); 
     return true; 
    // case R.id.menu_exit: 
    //  signOutAndKillProcess(); 

     // return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

它發生在所有的代碼,其中一些開關/箱的問題。 在每個:

case R.id.XXX 

日食返回我一個錯誤:「CASE表達式必須是常量表達式」

然後我試圖刪除R.java,清潔,再生,但沒有工作。 我該如何解決它?的XML的

那部分:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
<item 
     android:id="@+id/menu_add_account" 
     android:title="@string/menu_add_account" 
     android:icon="@android:drawable/ic_menu_add" 
       app:showAsAction="always|withText" 
     > 
</item> 
+0

當您使用開關的情況下始終嘗試使用打破,而不是回報。 – 2014-11-05 09:35:27

+0

我知道@HareshChhelana ..但是這個代碼不是我的...而且我試圖清理所有,並且解決那種似乎在創建時沒有發生的錯誤..... 它是可怕的....:S – Shudy 2014-11-05 09:40:17

回答

0

代碼象下面要解決 在最終詮釋分配菜單Id,然後在開關殼體中使用它。

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    final int menuId = item.getItemId(); 
    switch (menuId) 
    { 
    case R.id.menu_sign_out_all: 
     doHardShutdown(); 
     return true; 
    case R.id.menu_add_account: 
     return true; 
    case R.id.menu_settings: 
     Intent sintent = new Intent(this, SettingActivity.class); 
     startActivityForResult(sintent,0); 
     return true; 
    case R.id.menu_import_keys: 
     importKeyStore(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+0

不起作用,它與R.id.menu_XXX標記切換大小寫相同的錯誤。 eclipse給我的一個「自動更正」選項是使用「if-else」....但不能肯定以這種方式使用, – Shudy 2014-11-05 09:28:10

+0

好吧..解決方案是將開關/外殼轉換爲if-else。 ..我會添加到我的答案 – Shudy 2014-11-05 09:31:32

0

這個問題,我恰好這個原因:

In a regular Android project, constants in the resource R class are declared like this: 
public static final int main=0x7f030004; 

However, as of ADT 14, in a library project, they will be declared like this: 
public static int main=0x7f030004; 

這種類型的問題,解決的辦法是轉換 「的switch-case」 到 「的if-else」

(看更多在:http://tools.android.com/tips/non-constant-fields

原文:

switch (item.getItemId()) { 
    case R.id.menu_sign_out_all: 
     doHardShutdown(); 
     return true; 
    case R.id.menu_add_account: 
    // showExistingAccountListDialog(); 
     return true; 
    case R.id.menu_settings: 
     Intent sintent = new Intent(this, SettingActivity.class); 
     startActivityForResult(sintent,0); 
     return true; 
    case R.id.menu_import_keys: 
     importKeyStore(); 
     return true; 
    } 

解決方案

int itemId = item.getItemId(); 
     if (itemId == R.id.menu_invite_user) { 
      Intent i = new Intent(ContactListActivity.this, AddContactActivity.class); 
      i.putExtra(ImServiceConstants.EXTRA_INTENT_PROVIDER_ID, mProviderId); 
      i.putExtra(ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID, mAccountId); 
      i.putExtra(ImServiceConstants.EXTRA_INTENT_LIST_NAME, 
        mContactListView.getSelectedContactList()); 
      startActivity(i); 
      return true; 
     } else if (itemId == android.R.id.home || itemId == R.id.menu_view_accounts) { 
      startActivity(new Intent(getBaseContext(), ChooseAccountActivity.class)); 
      // finish(); 
      return true; 
     } else if (itemId == R.id.menu_settings) { 
      Intent sintent = new Intent(this, SettingActivity.class); 
      startActivity(sintent); 
      return true; 
     }