0

所以,我基本上是在玩弄某种登录表单,并试图在即将到来的活动中用用户名打个招呼。代码编译没有问题,但是当我点击登录按钮时应用程序崩溃,在我尝试实现自定义的 hello 之前登录成功,所以问题必须在以下代码中的某个地方。

这是我称之为活动的地方:

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 + "!");

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

提前致谢。

编辑:

我实际上发现我可能与以下事实有关所以我真的不知道我应该如何处理。

编辑2:

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

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

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

并且,在 Main Activity 内部,当调用 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);

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

4

3 回答 3

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);
于 2012-04-16T19:26:07.140 回答
0

由于您声明您希望将数据发送到 ProfileActivity 但需要打开 MainActivity,您可以遵循 4 种方法之一。

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

  1. 首先将数据发送到 MainActivity,然后在从 MainActivity 启动 ProfileActivity 时,发送之前传入的数据。
  2. 将数据放在 ProfileActivity 的公共静态字段中。公共静态变量可能会导致问题,所以我建议不要这样做。
  3. 将数据保存到 sharedPreferences 文件中,并在需要时在 ProfileActivity 中读取它。
  4. 子类应用程序,您可以在那里设置/访问许多变量。以下内容是从是否保证 Activity 类中的静态字段超过创建/销毁周期?

    公共类 MyApplication 扩展应用程序{私有字符串事物 = 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();
        }
    }
    
于 2012-04-16T20:00:24.500 回答
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);

像这样的东西。

但是,如果您需要整个应用程序中的用户名,请使用 Helper Class 来存储用户名。

于 2012-04-16T20:11:43.003 回答