放置并从另一个类中获得额外收益

时间:2018-08-19 15:55:36

标签: android class android-activity

我有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中具有全局性,因此我所有其他活动都只能调用一种方法,而不必在我的活动中获取和放置太多值。

3 个答案:

答案 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,并像正常情况一样获得其他功能。不要使您的代码过于复杂。关于问题的标题,IntentBundle已经是Android为您设计的用于传输数据的“另一个类”。

答案 2 :(得分:0)

好!所以这是我想建议您纠正的几件事。

需要在代码中进行更改。

  1. 您没有为“ intent”对象分配任何内容,并且您传递了一个intent而未为其分配任何内容。
  2. 您的实例cc_Extra在activity1中未执行任何操作。您可能想在类cc_Extras= new Extras(intent);的类的构造函数中传递“意图”对象,并在Extras类中执行以下操作-Intent intent; Extras(Intent i) { this.intent=i; }

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

  4. 创建新实例

代码中的更正

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。您可以根据需要扩展功能。

我希望这一定能使您的代码正常工作!