为什么我的包中的数据不会被发送到新活动?

时间:2010-12-14 18:34:08

标签: android

由于我无法确定的原因,当我在菜单设置中更改时,我传递给显示活动的名称字符串将不会更新。我省略了一些多余的代码,但希望概念在那里。特别是,当DisplayName启动时,我检查了调试器,并且放入intent中的额外内容不会更改其默认值(即:“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);
  }
}

3 个答案:

答案 0 :(得分:1)

有时您使用“名称”作为键从意图中获取值,有时则使用“NAME”。始终使用相同的,然后再试一次。

这就是为什么你应该有一个静态const字符串字段而不是硬编码该值到处

答案 1 :(得分: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();
    }
  }
}

答案 2 :(得分:0)

我修复了问题,我没有正确关闭活动,所以它只是恢复现有活动,而不是通过OnCreate步骤。