2012-04-16 93 views
0

因此,我基本上是用某种登录表单来欺骗,并试图在即将到来的活动中与用户名称说出自定义的问候语。该代码编译没有问题,但应用程序崩溃,只要我点击登录按钮,登录工作成功之前,我试图实现自定义你好,所以问题必须在下面的代码中的某个地方。在活动之间发送数据时发生崩溃

这里就是我所说的活动:

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

不过,我不能确定问题是否真的存在或不存在,我thoug它可能与第一个活动发送的数据类型与第二个活动的类型不匹配,但在尝试了一些东西后仍然没有任何线索。

在此先感谢。

编辑:

我居然发现我可能有一些做的事实,我打电话给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); 

问题解决了,感谢无论如何帮助大家。

+1

检查logcat并将其发布到此处,它会告诉你崩溃的原因。 – Jems 2012-04-16 19:20:23

+0

您正在将数据发送到MainActivity,但您正在阅读ProfileActivity中的意图数据。您确定这一点? – 2012-04-16 19:22:56

+0

是的,我刚刚编辑了评论,我想这是问题,但由于ProfileActivity作为一个选项卡在MainActivity内部,我现在不知道如何处理它,我承认在发布之前我没有看到它所以我想现在我们已经走了一步。 – 2012-04-16 19:26:45

回答

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); 
+0

是的,这种方式可行,但不打开我想要打开的活动。事情是我需要将数据发送到ProfileActivity,同时仍然打开MainActivity,因为ProfileActivity作为选项卡显示在MainActivity内部。 – 2012-04-16 19:33:43

0

既然你说你想要发送到ProfileActivity数据,但需要打开MainActivity,你可以遵循的4种方法之一。

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

  1. 首先将数据发送到在MainActivity,然后当你从MainActivity推出ProfileActivity,发送先前传入的数据。
  2. 将数据放在一个公共的静态字段ProfileActivity。公共静态变量可能会导致问题,所以我建议不要这样做。
  3. 将数据保存到sharedPreferences文件并在ProfileActivity中需要时读取它。
  4. 子类应用程序,您可以在其中设置/访问许多变量。下面的代码复制自Are static fields in Activity classes guaranteed to outlive a create/destroy cycle?

    public class MyApplication extends Application {0}私有String事件= 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(); 
        } 
    } 
    
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); 

这样的事情。

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