2010-12-14 54 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

相关问题