在活动之间发送数据时崩溃

时间:2012-04-16 19:18:48

标签: android crash android-activity

所以,我基本上都在使用某种登录表单,并尝试在即将进行的活动中用用户名说出一个自定义问候语。代码编译没有问题,但是一旦我点击登录按钮,应用程序崩溃,登录成功之前我尝试实现自定义问候,所以问题必须在以下代码中的某处。

以下是我称之为活动的地方:

Intent k = new Intent(this, MainActivity.class);
            //Sends login name to activity k
            k.putExtra("loginName", login.getText().toString()); 
 //login is the EditText variable name for the login text field
            startActivity(k);

这是我检索额外数据并尝试按照描述使用它的地方:

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class ProfileActivity extends Activity {

    TextView helloString;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
        Bundle extras = getIntent().getExtras();

        //Getting the hello text string
        helloString = (TextView)findViewById(R.id.textHello);
        String loginName = extras.getString("loginName");
        helloString.setText("¡Hello, " + loginName + "!");

    }

}

如果我对这两行进行评论,它会以某种方式避免崩溃:

String loginName = extras.getString("loginName");
helloString.setText("¡Hello, " + loginName + "!");

仍然,我无法确定问题是否确实存在,我认为这可能与第一个活动发送的数据类型有关,而第一个活动与第二个活动中检索的类型不匹配,但是在尝试了一些东西之后仍然没有任何线索。

提前致谢。

编辑:

我实际上发现我可能与我调用mainActivity.class这个事实有关,而文本是在一个名为profileActivity.class的活动中显示的,问题是,profileActivity被显示为一个标签在mainActivity中,所以我真的不知道该如何处理它。

编辑2:

所以我最终自己解决了,对于任何感兴趣的人我只是将数据发送到MainActivity.class

Intent k = new Intent(this, MainActivity.class);

            //Sends login name to activity k
            k.putExtra("loginName", login.getText().toString());
            startActivity(k);

并且,在主活动中,当调用ProfileActivity将其设置为选项卡时:

//Profile tab
            intent = new Intent(this, ProfileActivity.class);
            Bundle extras = getIntent().getExtras();
            intent.putExtra("loginName", extras.getString("loginName"));
            spec = mTabHost.newTabSpec("home")
                    .setIndicator("Home", res.getDrawable(R.drawable.profile_icon))
                    .setContent(intent);
            mTabHost.addTab(spec);

问题解决了,感谢大家的帮助。

3 个答案:

答案 0 :(得分:1)

您的意图是引用MainACtivity.class,并且您正在尝试在ProfileActivity中获取额外内容。尝试将MainActivity.class更改为ProfileActivity.class,如果这是您的流程。请交叉检查您的活动流程。

希望它有所帮助。

Intent k = new Intent(this, ProfileActivity.class);
            //Sends login name to activity k
            k.putExtra("loginName", login.getText().toString()); 
 //login is the EditText variable name for the login text field
            startActivity(k);

答案 1 :(得分:0)

由于您声明要将数据发送到ProfileActivity但需要打开MainActivity,您可以按照以下四种方法之一进行操作。

注意:您应该检查何时使用getExtra,返回的值不为null,并相应地处理它。

  1. 首先将数据发送到MainActivity,然后从MainActivity启动ProfileActivity时,发送先前传入的数据。
  2. 将数据放入ProfileActivity中的公共静态字段中。公共静态变量可能会导致问题,因此我建议不要这样做。
  3. 将数据保存到sharedPreferences文件,并在需要时在ProfileActivity中阅读。
  4. SubClass Application,您可以在那里设置/访问许多变量。以下内容是从Are static fields in Activity classes guaranteed to outlive a create/destroy cycle?复制的:

    公共类MyApplication扩展Application {         private String thing = null;

        public String getThing(){
            return thing;
        }
    
        public void setThing( String thing ){
            this.thing = thing;
        }
    }
    
    public class MyActivity extends Activity {
        private MyApplication app;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            app = ((MyApplication)getApplication());
    
            String thing = app.getThing();
        }
    }
    

答案 2 :(得分:0)

在MainActivity上:

String user = this.getIntent().getStringExtra("loginName");

当您在MainActivity上创建tabhost时,以相同的方式传递字符串:

Intent intent = new Intent().setClass(this, ProfileActivity.class);
intent.putExtra("loginName", user);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = mTabHost.newTabSpec("profile").setIndicator("Profile").setContent(intent);
mTabHost.addTab(spec);

像这样。

但如果您需要整个应用程序中的用户名,请使用帮助程序类来存储用户名。