java - 在启动Intent之前更改布局内容,例如文本和图像

标签 java android android-layout android-intent android-event

我有 2 个 View ,MainActivityUnitActivity。在主要 Activity 中,有一些按钮,当用户单击它们时,我想带上 uo UnitActivity

UnitActivity布局文件中,有一些 View ,例如TextView。例如,如果用户单击名为 btn_marine 的按钮,我想在布局中填充有关 Marine 的信息(星际争霸游戏中的一个单位,如果您知道的话:P)。

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

目前我正在尝试对此进行硬编码,我的意思是在开始 Intent 之前,并且我在 MainActivityOnCreate 方法中有按钮事件:

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 以便自动填充 View ?

这是我想要制作的 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;
    }
}

最佳答案

好吧,事实是,如果您尚未设置布局,则无法编辑 View 。这就是你的空指针的来源;您当前的布局没有您正在寻找的textView。

您可以做的是将您的信息通过 Intent 传递给新 Activity 并在那里切换

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);
    }
});

在设置布局后,在下一个 Activity 的 onCreate 中:

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

等等等等

这很粗糙,因为将其作为字符串传递是一个坏主意(将其作为可切换对象传递,有大量的单位!),并将 View 切换放在自己的函数/类中,这样就不会困惑你的 onCreate().不过Android中传递东西的一般逻辑就在这里,剩下的你可以弄清楚:)

关于java - 在启动Intent之前更改布局内容,例如文本和图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17924912/

相关文章:

android - RecyclerView 中具有最大宽度的简单约束布局子项

android - 如何实现类似于 Google map 和 Twitter 的滑出式菜单 Pane ?

android - popupWindow.setOnDismissListener 再次触发popupmenu

java - 使用枚举值作为泛型参数实现接口(interface)

android - Mapsforge on tap listeners 用于多个标记

android - admob 中的 OnFailedTorecieve 错误

android - Android NDK (Cocos2d-x) 打开数据库文件失败

java - 如果未找到结果,则显示 Toast

java - 以编程方式确定 IOException 的原因?

java - 使用现有 Hazelcast 实例初始化 SessionFactory