Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在开始意图之前更改版面内容,如文本和图像_Java_Android_Android Layout_Android Intent_Android Event - Fatal编程技术网

Java 在开始意图之前更改版面内容,如文本和图像

Java 在开始意图之前更改版面内容,如文本和图像,java,android,android-layout,android-intent,android-event,Java,Android,Android Layout,Android Intent,Android Event,我有两个视图,MainActivity和UnitActivity。在主活动中有一些按钮,当用户单击它们时,我想将uoUnitActivity 在UnitActivitylayout文件中有一些视图,如TextView。例如,如果用户单击一个名为btn_marine的按钮,我想在布局中填充有关marine(星际争霸游戏中的一个单位,如果你知道:P)的信息 因此,我的想法是,当用户单击每个单元的按钮时,我用我关于该单元的信息填充UnitActivity布局的文本和图像 目前,我正在尝试硬编码,我的意

我有两个视图,
MainActivity
UnitActivity
。在主活动中有一些按钮,当用户单击它们时,我想将uo
UnitActivity

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

因此,我的想法是,当用户单击每个单元的按钮时,我用我关于该单元的信息填充
UnitActivity
布局的文本和图像

目前,我正在尝试硬编码,我的意思是在开始意图之前,我在
MainActivity
OnCreate
方法中有按钮事件:

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
类来保存每个单元的信息,但我不知道如何从该类中填充意图

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

例如,这是我想要制作的
单元
类:

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

你不能这样做。您正在尝试以不同的
布局访问
视图
。除非在下一个
活动
中调用
setContentView()
布局,否则无法更新
视图

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

public void onClick(View view) {

    Intent intent = new Intent(MainActivity.this, UnitActivity.class);
    Unit.Name = "Marine!";
    startActivity(intent);
}
public void onCreate(...)
{
     super....
     setContentView(...);
     TextView unitNameView = (TextView) findViewById(R.id.textViewUnitName);
     String name = Unit.Name;
      unitNameView.setText(name);
然后在
UnitActivity

public void onClick(View view) {

    Intent intent = new Intent(MainActivity.this, UnitActivity.class);
    Unit.Name = "Marine!";
    startActivity(intent);
}
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;

并且去掉大部分的
getter/setter
,以静态方式访问变量值,这样会更快。还要注意的是,如果操作系统需要内存,静态变量可以被销毁,但是从一个
活动转到下一个
活动,获取数据就可以了。

你不能这样做。您正在尝试以不同的
布局访问
视图
。除非在下一个
活动
中调用
setContentView()
布局,否则无法更新
视图

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

public void onClick(View view) {

    Intent intent = new Intent(MainActivity.this, UnitActivity.class);
    Unit.Name = "Marine!";
    startActivity(intent);
}
public void onCreate(...)
{
     super....
     setContentView(...);
     TextView unitNameView = (TextView) findViewById(R.id.textViewUnitName);
     String name = Unit.Name;
      unitNameView.setText(name);
然后在
UnitActivity

public void onClick(View view) {

    Intent intent = new Intent(MainActivity.this, UnitActivity.class);
    Unit.Name = "Marine!";
    startActivity(intent);
}
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;

并且去掉大部分的
getter/setter
,以静态方式访问变量值,这样会更快。还要注意的是,如果操作系统需要内存,那么静态变量可以被销毁,但是从一个
活动转到下一个
活动,获取数据就可以了。

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

在类中实现parcelable如下():

}

您将能够在主要活动中执行以下操作:

intent.putExtra("Unit", new Unit("something",...));
在你的行动中找回它

Bundle data = getIntent().getExtras();
Unit unit = (Unit) data.getParcelable("Unit");

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

在类中实现parcelable如下():

}

您将能够在主要活动中执行以下操作:

intent.putExtra("Unit", new Unit("something",...));
在你的行动中找回它

Bundle data = getIntent().getExtras();
Unit unit = (Unit) data.getParcelable("Unit");

好吧,问题是,如果没有设置布局,就不能编辑视图。这就是你的来源;您当前的布局没有您要查找的文本视图

你所能做的,就是通过一个意图将你的信息传递给新的活动,并在那里切换

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中传递东西的一般逻辑是这样的,你可以找出剩下的:)

好吧,问题是,如果你没有设置布局,你就不能编辑视图。这就是你的来源;您当前的布局没有您要查找的文本视图

你所能做的,就是通过一个意图将你的信息传递给新的活动,并在那里切换

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中传递信息的一般逻辑如下:,你可以找出剩下的:)

R.id.textViewUnitName
是在UnitActivity布局文件中声明的吗?
R.id.textViewUnitName
是在UnitActivity布局文件中声明的吗?我认为,为了使类更加模块化和可读性,最好不要将其作为静态变量持久化。他可以通过意图传递整个单位对象,并在另一边使用它。只需通过一个活动事务传递某些内容,就不需要添加帮助器函数@如果只是传递一个变量,那么我同意。那个类中有很多变量,所以我不知道OP需要传递多少。如果是