我有Act_01(在其中放置值)和Act_02(在其中获取值),但是在Extras类中声明了这些方法,从Act_02获取值将返回空值:
Act_01 :(我要将“名称”值传递给Act_02的地方)
public class Act_01 extends Activity {
Extras cc_Extras;
Button btn1;
Intent intent;
String str_Name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_01);
cc_Extras = new Extras();
str_Name = "Buck";
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
cc_Extras.putExtras();
startActivity(intent);
}
});
}
}
Act_02 :(我想让ot从Act_01接收值Name,但应用程序崩溃时为空值)
public class Act_02 extends Activity {
Extras cc_Extras;
String str_Name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_02);
cc_Extras = new Extras();
if(getIntent() != null && getIntent().getExtras() != null)
{
cc_Extras.getExtras();
}
Toast.makeText(getApplicationContext(), "Name: "+str_Name, Toast.LENGTH_SHORT).show();
}
}
其他:(我定义放置和获取其他方法的地方)
public class Extras extends Activity {
String str_Name;
Intent intent;
public void putExtras() {
// TODO Auto-generated method stub
intent.putExtra("KEY_Name", str_Name);
}
public void getExtras() {
// TODO Auto-generated method stub
str_Name = getIntent().getExtras().getString("KEY_Name");
}
}
编辑:我不想直接在活动之间传递和获取数据,我想使用第3类(Extras.java),因为我有太多的活动彼此之间具有太多的值,并且想要对它们进行某种定义在Extras中具有全局性,因此我所有其他活动都只能调用一种方法,而不必在我的活动中获取和放置太多值。
答案 0 :(得分:1)
在这两个活动中,您都将创建一个Extras类的新实例,这意味着它们不具有相同的值,您可以这样做以将数据从A传输到B
public class Act_01 extends Activity {
Button btn1;
Intent intent;
String str_Name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_01);
str_Name = "Buck";
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
intent = new Intent(Act_01.this, Act_02.class);
intent.putExtra("data", str_Name)
startActivity(intent);
}
});
}
}
并接收这样的数据
public class Act_02 extends Activity {
String str_Name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_02);
// cc_Extras = new Extras();
if(getIntent() != null)
{
if (getIntent().getStringExtra("data") != null) {
Toast.makeText(Act_02.this, "Name: "+getIntent.getStringExtra("data"), Toast.LENGTH_SHORT).show();
}
}
}
}
另外,您应该考虑使用活动上下文而不是应用程序上下文
答案 1 :(得分:1)
您的应用程序崩溃不是因为空值而是空指针 reference 所致,因为您手动创建了new Activity
cc_Extras = new Extras();
然后在其上调用了生命周期方法
cc_Extras.getExtras()
哪个调用了getIntent()
,但是Android框架从未设置过Intent,并且cc_Extras.getExtras()
不会在第二个Activity中拥有您想要的任何数据,因为它只是在第二个Activity中创建的,不是来自第一个活动。
简而言之,您永远不应该进行新的Activity,并且Extras类不必首先是Activity(它也不会提供很多好处)。
只需使用第一个Activity提供的Intent对象即可启动第二个Activity,并像正常情况一样获得其他功能。不要使您的代码过于复杂。关于问题的标题,Intent
和Bundle
已经是Android为您设计的用于传输数据的“另一个类”。
答案 2 :(得分:0)
好!所以这是我想建议您纠正的几件事。
需要在代码中进行更改。
您的实例cc_Extra在activity1中未执行任何操作。您可能想在类cc_Extras= new Extras(intent);
的类的构造函数中传递“意图”对象,并在Extras类中执行以下操作-Intent intent;
Extras(Intent i)
{
this.intent=i;
}
在activity2中,您正在创建Extras()的新实例。因此,根据您的代码,默认情况下它将为NULL。如果您已完成上一步的更改,则可以通过执行cc_Extras(getIntent());
代码中的更正
1)在Extras类的getExtras()方法而不是str=getIntent()
中使用str=intent.getExtras.getString()
。
2)在activity2中,您没有为String str_Name分配任何内容,因此您需要返回在getExtras()方法中获得的字符串。您可以通过将返回类型更改为String来实现。下面是示例代码。
public String getExtras()
{
str_Name=intent.getExtras().getString("KEY_Name");
//OR
//str_Name=intent.getStringExtra("KEY_Name");
return str_Name;
}
3)通过执行此操作,您需要通过执行`
来在activity2中捕获此字符串if(getIntent() != null && getIntent().getExtras() != null)
{
str_Name=cc_Extras.getExtras();
}`
4)另一件事是,您必须像这样创建意图-
Intent intent=new Intent(currentActivityName.this,anotherActivity2.class);
//then use the intent object
编辑-您的代码最后必须看起来像这样...
Act1
public class Act_01 extends Activity {
Extras cc_Extras=null;
Button btn1;
String str_Name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_01);
str_Name = "Buck";
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//changes to do
Intent intent= new Intent(Act01.this,Act02.class);
cc_Extras= new Extras(intent);
cc_Extras.putExtras(str_Name);
//end
startActivity(intent);
}
});
}
}
Act02
public class Act_02 extends Activity {
Extras cc_Extras;
String str_Name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_02);
cc_Extras = new Extras(getIntent());
if(getIntent() != null && getIntent().getExtras() != null)
{
str_Name=cc_Extras.getExtras();
}
Toast.makeText(getApplicationContext(), "Name: "+str_Name, Toast.LENGTH_SHORT).show();
}
}
其他班级
public class Extras { //remove "extends Activity" because it is a class not a activity
String str_Name;
Intent intent;
Extras(Intent i)
{
this.intent=i;
}
public void putExtras(String str) {
// TODO Auto-generated method stub
str_Name=str;
intent.putExtra("KEY_Name", str_Name);
}
public String getExtras() {
// TODO Auto-generated method stub
str_Name = intent.getExtras().getString("KEY_Name");
return str_Name;
}
}
以上代码仅适用于String。您可以根据需要扩展功能。
我希望这一定能使您的代码正常工作!