【问题标题】:Android - Trouble passing variables between activities using intentsAndroid - 使用意图在活动之间传递变量时遇到问题
【发布时间】:2012-04-24 05:08:41
【问题描述】:

我是 Android 新手,我只是想将两个双打从一个活动传递到另一个活动。这个问题已经在这个网站上以几种不同的方式被问过几次,但是关于我的实现的一些事情导致我的应用程序强制关闭。我认为我的问题可能与我试图将变量传递给的活动中的“savedInstanceState”Bundle 有关。我显然遗漏了很多代码,但我包括了所有使用 Bundles 的地方。

[编辑] - 我发现了一个糟糕的编程解决方案来解决我需要做的事情。我将公共静态变量放在接收类中并从发送类访问它们。我意识到这是糟糕的编程,但它可以满足我的需求。感谢所有试图提供帮助的人。我将继续尝试以正确的方式做到这一点。

没有 i.putExtra 行和任何涉及 Bundle extra 的行,它工作正常。代码如下:

int lat = 0;
int lon = 0;
private void createNote() {
    Intent i = new Intent(this, NoteEdit.class);
    i.putExtra("lat", lat);
    i.putExtra("lon", lon);
    startActivityForResult(i, ACTIVITY_CREATE);
}

这是我发送给他们的活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle extra = getIntent().getExtras();
    int lat = extra.getInt("lat");
    int lon = extra.getInt("lon");

mRowId = (savedInstanceState == null) ? null : (Long) savedInstanceState.getSerializable(NotesDbAdapter.KEY_ROWID);
    if (mRowId == null) {
        Bundle extras = getIntent().getExtras();
        mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) : null;
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    saveState();
    outState.putSerializable(NotesDbAdapter.KEY_ROWID, mRowId);
}

@Override
protected void onPause() {
    super.onPause();
    saveState();
}

@Override
protected void onResume() {
    super.onResume();
    populateFields();
}

private void saveState() {
    String title = mTitleText.getText().toString();
    String body = mBodyText.getText().toString();
    String lattitude = mLatText.getText().toString();
    String longitude = mLonText.getText().toString();
    String date = mDateText.getText().toString();
    String time = mTimeText.getText().toString();

    if (mRowId == null) {
        long id = mDbHelper.createNote(title, body, lattitude, longitude, date, time);
        if (id > 0) {
            mRowId = id;
        }
    } else {
        mDbHelper.updateNote(mRowId, title, body, lattitude, longitude, date, time);
    }
}

【问题讨论】:

  • 您的应用程序因什么错误而被强制关闭...以及在哪一行?
  • @raju 是对的:如果你想要任何准确的建议,你必须包含一个 logcat 跟踪。
  • 您确定传递浮点数和检索整数是正确的吗?
  • 04-24 15:57:32.162: E/AndroidRuntime(631): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.meh.tabbedlayout/com.meh.tabbedlayout.NoteEdit} : android.database.CursorIndexOutOfBoundsException: 请求索引 0,大小为 0

标签: android class variables android-intent


【解决方案1】:

这就是你应该传递值的方式。

Bundle bundle = new Bundle();
bundle.putString("str1", str1);
bundle.putInt("int1", int1);
bundle.putDouble("double1", double1);
Intent i = new Intent(this, Activity2.class);
i.putExtras(bundle);
startActivityForResult(i);

这就是你在下一个活动中获得它们的方式

int int1 = getIntent().getExtras().getInt("int1")
String str1 = getIntent().getExtras().getString("str1")
double double1 = getIntent().getExtras().getDouble("double1")

这是否消除了您的疑虑?

【讨论】:

  • 我这样做了,但它仍然强制关闭。我尝试一次添加一行然后运行它,我发现我可以创建一个 Bundle 并向其中添加变量,但是当我添加 i.putExtras(bundle) 时它会强制关闭。你知道为什么会导致问题吗?
  • 那么我认为最好在此处发布 logcat 条目。这可能会给我们一个关于错误在哪里的线索。 logcat 到底会显示什么错误?空指针??
  • 是的,先生/妈妈,它实际上是一个空指针。 04-24 15:57:32.162:E/AndroidRuntime(631):java.lang.RuntimeException:无法启动活动 ComponentInfo{com.meh.tabbedlayout/com.meh.tabbedlayout.NoteEdit}:android.database.CursorIndexOutOfBoundsException:索引请求 0,大小为 0
  • 问题似乎出在 DBHelper 类的 createNote、updateNote 或 SQLite 检索方法中。游标越界异常与在活动之间传递值或使用捆绑包无关。请检查 mDBHelper 和数据检索方法。
【解决方案2】:

看起来不错,你的问题在其他地方。 在设置意图之前尝试添加打印,以确保您的键和值是您真正认为的那样

【讨论】:

    【解决方案3】:
    int name = getIntent().getExtras().getInt(key);
    

    您正在调用startActivityforresult。因此请尝试将捆绑包放入onActivityResult 而不是oncreate。您可以覆盖此onActivityResult

    • 我认为这是尝试使用 this 获取捆绑包的问题。您将获得此新变量的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 2018-06-22
      • 2017-10-10
      • 2013-08-01
      相关资源
      最近更新 更多