0

我有 2 个视图,MainActivity并且UnitActivity. 在主要活动中有一些按钮,当用户点击它们时,我想带上 uo UnitActivity

UnitActivity布局文件中有一些视图,如 TextView。例如,如果用户单击一个名为btn_marineI want to fill layout with information about marine(星际争霸游戏中的一个单位,如果你知道的话:P)的按钮。

所以我的想法是当用户点击每个单元的按钮时,我UnitActivity会用我拥有的关于该单元的信息填充布局的文本和图像。

目前,我正在尝试对其进行硬编码,我的意思是在开始意图之前,并且我有以下OnCreate方法中的按钮事件MainActivity

Button btn_marine = (Button) findViewById(R.id.btn_unit_marine);
btn_marine.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Intent intent = new Intent(MainActivity.this, UnitActivity.class);
        TextView unitNameView = (TextView) findViewById(R.id.textViewUnitName);
        unitNameView.setText("Marine!"); //this is line 28 with error
        startActivity(intent);
    }
});

但是,一旦我单击按钮,应用程序就会退出,并出现以下错误logcat

07-29 14:56:03.906  12696-12696/com.eetutorials.terranmate E/AndroidRuntime: FATAL EXCEPTION: main
        java.lang.NullPointerException
        at com.eetutorials.terranmate.MainActivity$1.onClick(MainActivity.java:28)
        at android.view.View.performClick(View.java:4204)
        at android.view.View$PerformClick.run(View.java:17355)
        at android.os.Handler.handleCallback(Handler.java:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)

所以我的问题是我的代码有什么问题,而且,你认为做这件事的最好方法是什么?我试图创建一个Unit包含每个单元信息的类,但我不知道如何从该类中填充 Intent。

我的意思是如何将该类传递给UnitActivity以便自动填充视图?

例如,这是Unit我想做的课程:

public class Unit
{
    private String Name;
    private String HitPoint;
    private String Armor;
    private DamageModifiers DamageModifier;
    private String BaseDamage;
    private String Description;

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getHitPoint() {
        return HitPoint;
    }

    public void setHitPoint(String hitPoint) {
        HitPoint = hitPoint;
    }

    public String getArmor() {
        return Armor;
    }

    public void setArmor(String armor) {
        Armor = armor;
    }

    public DamageModifiers getDamageModifier() {
        return DamageModifier;
    }

    public void setDamageModifier(DamageModifiers damageModifier) {
        DamageModifier = damageModifier;
    }

    public String getBaseDamage() {
        return BaseDamage;
    }

    public void setBaseDamage(String baseDamage) {
        BaseDamage = baseDamage;
    }

    public String getDescription() {
        return Description;
    }

    public void setDescription(String description) {
        Description = description;
    }
}
4

3 回答 3

1

你不能这样做。您正在尝试访问Views不同的layout. Views在你膨胀了layout诸如调用setContentView()next之前,你不能更新Activity

您可以做的是将变量Unit.java作为static变量,然后在单击按钮时设置它们,例如MainActivity

public void onClick(View view) {

    Intent intent = new Intent(MainActivity.this, UnitActivity.class);
    Unit.Name = "Marine!";
    startActivity(intent);
}

然后在UnitActivity

public void onCreate(...)
{
     super....
     setContentView(...);
     TextView unitNameView = (TextView) findViewById(R.id.textViewUnitName);
     String name = Unit.Name;
      unitNameView.setText(name);

所以你Unit.java看起来更像

    public class Unit
{
    public static String Name;
    public static String HitPoint;
    public static String Armor;
    public DamageModifiers DamageModifier;
    public static String BaseDamage;
    public static String Description;

并摆脱您的大部分getters/setters并静态访问变量值,它会更快。另请注意,如果static变量需要内存,则操作系统可以销毁变量,但从一个Activity到下一个并获取数据就可以了。

于 2013-07-29T13:12:31.303 回答
1

你有一个NullPointerException因为你的按钮在 UnitActivity 布局中。我认为实现您想要做的事情(将类传递给其他活动)的最佳方法是使用android parcelable

你在你的类中实现 parcelable 像这样(如何使我的自定义对象 Parcelable?):

public class Unit implements Parcelable{
    private String atrribute1;
    ...
    ...
    // Constructor
    public Unit(String attribute1,...){
        this.attribute1 = attribute1;
   }
   // Getter and setter methods
   .........
   .........

   // Parcelling part
   public Unit(Parcel in){
       String[] data = new String[3];

       in.readStringArray(data);
       this.attribute1 = data[0];
       ... = data[1];

   }

   @Оverride
   public int describeContents(){
       return 0;
   }

   @Override
   public void writeToParcel(Parcel dest, int flags) {
       dest.writeStringArray(new String[] {this.attribute1,...});
   }
   public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
       public Unit createFromParcel(Parcel in) {
           return new Unit(in); 
       }

       public Unit[] newArray(int size) {
           return new Unit[size];
       }
   };

}

您将能够在 MainActivity 中执行以下操作:

intent.putExtra("Unit", new Unit("something",...));

并像在你的 UnitActivity 中那样检索它

Bundle data = getIntent().getExtras();
Unit unit = (Unit) data.getParcelable("Unit");
于 2013-07-29T13:16:08.493 回答
1

好吧,事情是这样的,如果你没有设置你的布局,你就不能编辑一个视图。那就是你的空指针来自哪里;您当前的 Layout 没有您正在寻找的 textView。

您可以做的是将您的信息通过意图传递给新活动并将其切换到那里

Button btn_marine = (Button) findViewById(R.id.btn_unit_marine);
btn_marine.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Intent intent = new Intent(MainActivity.this, UnitActivity.class);
        intent.putExtra("unitType","marine")
        startActivity(intent);
    }
});

在您的下一个活动的 onCreate 中,设置布局后:

 Bundle extras = getIntent().getExtras();
 String unitType = extras.getString("unitType");
 if (unitType.equals("marine")) {
 TextView unitNameView = (TextView) findViewById(R.id.textViewUnitName);
    unitNameView.setText("Marine!");
 }

等等等等

它很粗糙,因为将它作为字符串传递是一个坏主意(将它作为可切换对象传递,有很多单位!),并将视图切换放在它自己的函数/类中,这样你就不会弄乱你的 onCreate( )。但是在Android中传递事物的一般逻辑在这里,你可以弄清楚其余的:)

于 2013-07-29T13:16:54.433 回答