Android - 如何从活动中检索数据

时间:2011-09-12 01:22:02

标签: android

我是android新手所以请原谅新手问题。我有一个游戏,我试图从旧的Java小程序移植到Android。我的目标是让这个功能正常,然后在CodeProject这样的网站上发布一篇文章(如果有更合适的话,可以发表更好的文章)。这个想法是为了表明Android开发人员可以在合理的时间内创建应用程序。

我正在取得一些进展但遇到了问题。我有用户与之交互的主要活动。然后,我创建了一个菜单项,该菜单项又开始第二个活动(称之为子项),其中包含适当数量的复选框,搜索栏等以填充参数。我可以成功地传递包含从main到child的所有选项的类。但是我无法让孩子将这些数据传回主体。 首先是我的主要代码启动子活动:

public void addBalls()
{
    Intent myIntent = new Intent(this, GameOptions.class);

    Bundle b = new Bundle();
    b.putSerializable("options", gameParams);
    myIntent.putExtras(b);
    startActivityForResult(myIntent,STATIC_OPTIONS_VALUE);
}

传递给孩子的数据(希望又回来了)是:

public class GameOptionParams implements Serializable
{
    private static final long serialVersionUID = 1L;

    public int speedBarPosition;
    public int vgravityBarPosition;
    public int mgravityBarPosition;
    public int viscosityBarPosition;
    public int restititionBarPosition;
    public boolean trace;
    public boolean collide;
    public boolean mush;
    public boolean wrap;
    public boolean flicker;
}

这是预期的回报(再次在主要方面)

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) 
  { 
    case (STATIC_OPTIONS_VALUE) : 
    { 
      if (resultCode == Activity.RESULT_OK) 
      { 
          //retrieve intended options
          Bundle b = data.getExtras();
          gameParams = (GameOptionParams) b.getSerializable("options");
      } 
      break; 
    } 
  } 
}

子活动成功接收到gameParams数据。然后它与用户交互以更新值,然后我尝试返回它但它似乎没有被发送到main。这是onStop()覆盖中的子代码。 也许这个代码不应该在onStop()覆盖中,但是我无法确定放置它的位置。

@Override
public void onStop()
{
    super.onStop();

    //read widget values
    gameParams.speedBarPosition     = speedBar.GetPosition();
    gameParams.vgravityBarPosition      = vgravityBar.GetPosition();
    gameParams.mgravityBarPosition      = mgravityBar.GetPosition();
    gameParams.viscosityBarPosition = viscosityBar.GetPosition();
    gameParams.restititionBarPosition   = restititionBar.GetPosition();

    //todo save to persistent   
    Intent resultIntent = new Intent(this, TiltBall2ImpactActivity.class);
    Bundle b = new Bundle();
    b.putSerializable("options", gameParams);
    resultIntent.putExtras(b);
    setResult(Activity.RESULT_OK, resultIntent);
}

回到主onActivityResult覆盖中,我总是看到requestCode = 0,resultCode = 0,data = null。我认为这是一个典型的新手问题,我一直在阅读sdk文档,用户论坛等,并已接近解决方案,但还没有到那里。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

由于这是游戏的设置菜单,我假设您将需要这些值用于多个活动。如果是这样,你扩展android.app.Application类。

在该课程中,您可以创建属性来保存您的值。在任何活动中,您都可以致电

MyApplication myApp = (MyApplication)getApplicationContext();

其中myApp是单身人士。因此,您将获得您从其他活动设置的值。

您需要将此代码添加到清单文件中的应用程序代码中才能使其正常工作

android:name=".MyApplication"

如果您需要为下次启动应用程序保留这些值,则需要使用SharedPreferences。这是一个很好的教程

http://saigeethamn.blogspot.com/2009/10/shared-preferences-android-developer.html

答案 1 :(得分:0)

假设在您的“子”活动中,用户必须按“确定”或“保存”按钮,然后输入代码以在按钮的gameParams处理程序中设置onClick(...)参数。

使用默认构造函数实例化Intent,例如......

Intent resultIntent = new Intent();

...然后在创建Bundle并向其添加gameParams并致电setResult(...)后,只需致电finish()即可终止'子'活动。我没有多少时间可以考虑覆盖onStop(),我怀疑你不想使用它来尝试返回意图。