2010-12-14 55 views
0

由於我無法確定的原因,當我在菜單設置中更改名稱字符串時,傳遞給顯示活動的名稱字符串將不會更新。我省略了一些額外的代碼,但希望這些概念在那裏。特別是,當DisplayName啓動時,我使用調試器進行了檢查,並且放入intent的extras不會從其默認值(即:「John Doe」)中更改。我注意到,當我使用選項菜單活動更改名稱時,每次返回選項菜單時都會反映此更改。但是,當我進入顯示屏時,名稱仍然保持不變。爲什麼我的包中的數據沒有被髮送到新的活動?

我知道這些值很簡單,它們可以保存在靜態成員變量中,我通常不必處理bundle的傳遞,但是我仍然很好奇爲什麼我的代碼無法運行正確。

我注意到,如果我使用菜單選項先設置名稱,然後單擊顯示按鈕,更改將反映出來。但是,返回主屏幕並更改名稱後,顯示屏幕將繼續保持相同的名稱。這讓我認爲,因爲我按下「返回」從顯示活動返回到主屏幕,所以活動永遠不會被終止,因此它永遠不會改變顯示的名稱。這個猜測是否正確?

public class MainScreen extends activity { 
    private String mName; 
    public static final String EXTRA_NAME = "android.intent.extra.NAME"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mName = "John Doe" 

     Button button = (Button) findViewById(R.id.display_button); 
     button.setOnClickListener(mDisplayButtonListener); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     menu.add(0, SET_CONTACT_ID, 0, R.string.menu_setName); 
     return true; 
    } 

    @Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     switch(item.getItemId()) { 
      case SET_CONTACT_ID: 
       Intent intent = new Intent(MainScreen.this, ContactEdit.class); 
       intent.putExtra(EXTRA_NAME, mName) 
       startActivityForResult(intent, 1); 
       return true; 
     } 

     return super.onMenuItemSelected(featureId, item); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK) 
     { 
      mName = data.getExtras().getString(EXTRA_NAME); 
     } 
    } 

    private OnClickListener mDisplayButtonListener = new OnClickListener() { 
     public void onClick(View v) {   
     Intent intent = new Intent(MainScreen.this, DisplayName.class); 
     intent.putExtra(EXTRA_NAME, mName); 
     startActivity(intent); 
     } 
    }; 
} 

public class ContactEdit extends Activity { 
    private EditText mEditName; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mEditName = (EditText) findViewById(R.id.editName); 
    mEditName.setText(this.getIntent().getExtras().getString(MainScreen.EXTRA_NAME)); 

    Button button = (Button) findViewById(R.id.submit_select); 
    button.setOnClickListener(mSubmitName); 
    } 

    private OnClickListener mSubmitName = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Intent intent = new Intent(); 
     mName = mEditName.getText().toString(); 
     intent.putExtra(MainScreen.EXTRA_NAME, mName); 
     setResult(RESULT_OK, intent); 
     finish(); 
    } 
    } 
} 

public class DisplayName extends Activity { 
    private String mName; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mName = getIntent.getExtras().getString(MainScreen.EXTRA_NAME) 
    TextView view = (TextView) findViewById(R.id.name); 
    view.setText(mName); 
    } 
} 

回答

0

我解決了問題,我沒有正確關閉活動,以便它只是一個恢復現有的活動,而不是通過OnCreate步驟。

1

有時您使用「名稱」作爲從意圖獲取值的鍵和其他時間使用「名稱」的鍵。始終使用相同的方法並重試。

這就是爲什麼你應該有,而不是到處

+0

這是一個高度截斷的代碼,我從削減我的大型項目,所以自然有一些錯誤。我在MainScreen活動中確實有一個靜態常量,所以這不太可能是問題所在。我想知道是否對於如何使用捆綁包或者在啓動新活動時未分配新捆綁包有語義誤解。 – damonkashu 2010-12-14 19:11:30

0

the name string I am passing to the display activity will not be updated when I change it in the menu setting

硬編碼該值在ContactEdit類的靜態常量字符串字段:

所有你做的是設置的文本EditText到你從MainScreen(這是「John Doe」)收到的。當你點擊按鈕mSubmitName時,你發送的值爲mName(在你的例子中甚至沒有聲明)。

要送你擁有的任何新的價值在EditText進入,你必須先檢索:

public class ContactEdit extends Activity { 
    private EditText mEditName; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mEditName = (EditText) findViewById(R.id.editName); 
    mEditName.setText(this.getIntent().getExtras().getString(MainScreen.EXTRA_NAME)); 

    Button button = (Button) findViewById(R.id.submit_select); 
    button.setOnClickListener(mSubmitName); 
    } 

    private OnClickListener mSubmitName = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Intent intent = new Intent(); 
     intent.putExtra(MainScreen.EXTRA_NAME, mEditName.getText()); // <-- Retrieve the value from the EditText 
     setResult(RESULT_OK, intent); 
     finish(); 
    } 
    } 
} 
+0

呃我應該剛剛複製我的整個源代碼而不是試圖縮短它的段落 – damonkashu 2010-12-14 21:21:11

+0

如果上述仍然不適合您的情況,請嘗試用所有活動的最簡單代碼('MainScreen', 'Display'和'ContactEdit'並將它們發佈到SO, – ccheneson 2010-12-14 22:41:23

相關問題