Android 从另一个班级获得额外的东西

Android 从另一个班级获得额外的东西,android,class,android-activity,Android,Class,Android Activity,我有Act_01(其中我放置值)和Act_02(其中我获取值),但在一个Extras类中声明了这些方法,从Act_02获取值返回空值: Act_01:(我想将值名称传递给Act_02) Act_02:(我想从Act_01接收值名,但应用程序崩溃,值为空) Extras:(我定义了放置和获取Extras的方法) 编辑:我不想在活动之间直接传递和获取数据,我想使用第三类(Extras.java)因为我有太多的活动,它们之间有太多的值,我想在Extras中对它们进行全局定义,这样我的所有其他活动都可以

我有Act_01(其中我放置值)和Act_02(其中我获取值),但在一个Extras类中声明了这些方法,从Act_02获取值返回空值:

Act_01:(我想将值名称传递给Act_02)

Act_02:(我想从Act_01接收值名,但应用程序崩溃,值为空)

Extras:(我定义了放置和获取Extras的方法)


编辑:我不想在活动之间直接传递和获取数据,我想使用第三类(Extras.java)因为我有太多的活动,它们之间有太多的值,我想在Extras中对它们进行全局定义,这样我的所有其他活动都可以调用一个方法,而不是在我的活动中获取和放置太多的值。

在这两个活动中,您正在创建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();
  }
}


}
}

你也应该考虑使用活动上下文而不是应用上下文

在这两个活动中,你正在创建一个新的Excel类实例,意味着它们不具有相同的值,你可以这样做来把数据从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();
  }
}


}
}

你也应该考虑使用活动上下文而不是应用上下文

你的应用程序崩溃不是空值,而是空指针<强>引用< /强>,因为你创建了<代码>新的活动< /代码>手动

cc_Extras =  new Extras();
然后对其调用生命周期方法

cc_Extras.getExtras()
它调用了
getIntent()
,但是这个Intent从来不是由Android框架设置的,而且
cc_Extras.getExtras()
在第二个活动中不会有任何您想要的数据,因为它是在那里创建的,而不是从第一个活动创建的

简单地说,你永远不应该做一个新的活动,你的额外课程一开始就不需要是一个活动(也没有提供太多的好处)


只需使用第一个活动提供的Intent对象来启动第二个活动,并像正常情况一样获得额外功能。不要使代码过于复杂。关于问题的标题,
Intent
Bundle
已经是安卓为您设计的传输数据的“另一类”

由于您手动创建了一个
新活动,您的应用程序崩溃的原因不是空值,而是空指针引用

cc_Extras =  new Extras();
然后对其调用生命周期方法

cc_Extras.getExtras()
它调用了
getIntent()
,但是这个Intent从来不是由Android框架设置的,而且
cc_Extras.getExtras()
在第二个活动中不会有任何您想要的数据,因为它是在那里创建的,而不是从第一个活动创建的

简单地说,你永远不应该做一个新的活动,你的额外课程一开始就不需要是一个活动(也没有提供太多的好处)


只需使用第一个活动提供的Intent对象来启动第二个活动,并像正常情况一样获得额外功能。不要使代码过于复杂。关于问题的标题,
Intent
Bundle
已经是安卓为您设计的传输数据的“另一类”

好的!下面是我想建议你改正的几件事

需要在代码中进行更改。

  • 您没有向“意图”对象分配任何内容,并且您已经传递了一个意图,但没有向其分配任何内容
  • 您的实例cc_Extra在活动1中没有执行任何操作。您可能希望在类的构造函数中传递“intent”对象,如
    cc_Extras=newextras(intent)并在Extras类中执行以下操作-
    Intent;
    额外费用(意向一)
    {
    这个.intent=i;
    }

  • 在activity2中,您正在创建Extras()的新实例。因此,根据您的代码,默认情况下它将为NULL。如果您已经完成了上一步的更改,那么可以通过执行
    cc_Extras(getIntent())创建新实例

  • 代码中的更正

    1) 在Extras类中,使用getExtras()方法代替
    str=getIntent()
    使用
    str=intent.getExtras.getString()

    2) 在activity2中,您没有为字符串str_名称分配任何内容,因此需要返回在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
    
    编辑-您的代码最终必须是这样的…

    行动1

    行动02

    附加班

    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;
    }
    }
    
    上面的代码只适用于字符串。如果需要,可以扩展该功能


    我希望这一定能让你的代码正常工作

    好的!下面是我想建议你改正的几件事

    需要在代码中进行更改。

  • 您没有向“意图”对象分配任何内容,并且您已经传递了一个意图,但没有向其分配任何内容
  • 您的实例cc_Extra在活动1中没有执行任何操作。您可能希望在类的构造函数中传递“intent”对象,如
    cc_Extras=newextras(intent)并在Extras类中执行以下操作-
    Intent;
    额外费用(意向一)
    {
    这个.intent=i;
    }

  • 在activity2中,您正在创建Extras()的新实例。因此,根据您的代码,默认情况下它将为NULL。如果您已经完成了上一步的更改,那么可以通过执行
    cc_Extras(getIntent())创建新实例

  • 代码中的更正

    1) 在Extras类中,使用getExtras()方法代替
    str=getIntent()
    使用
    str=intent.getExtras.getString()

    2) 在activity2中,您没有为字符串st分配任何内容
    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;
    }
    }