0

我是android新手,所以也许我做错了什么。我想要一个特定的活动来显示有关游戏“生物”类实例的详细信息。名字,受到的伤害,诸如此类。

我在让生物数据正确显示在 GUI 对象中时遇到问题。在初始创建时(应将生物的名称复制到名称字段中)和添加损坏标记时(不会更新以显示正确的图像)。

这是我所拥有的迷你示例:

public class CreatureDetailActivity2 extends Activity
{
  Creature creature;

  public void addMark(View v)
  {
    // connected to the button via android:onClick="addMark" in the XML
    creature.getTrack().addDamage(DamageType.Normal, 1);
    refreshDisplay();
    new AlertDialog.Builder(this).setTitle(creature.getName())
        .setMessage(creature.getTrack().toString()).show();
  }

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_creature_detail);
    creature = new Creature("Example");
    refreshDisplay();
  }


  public void refreshDisplay()
  {
    final View creatureDetailView = this.getLayoutInflater().inflate(
        R.layout.activity_creature_detail, null);

    final EditText nameField = (EditText) (creatureDetailView
        .findViewById(R.id.textbox_creature_name));
    nameField.setText(creature.getName());

    final ImageView damageBox0 = (ImageView) (creatureDetailView.findViewById(R.id.damageBox0));
    damageBox0.setImageResource(R.drawable.__n);
    // in the full program this does the same for 0 through 9, but this is a sample
    // also, in the full program, this is a dynamic lookup for the correct pic
    // but again, this is just a sample version.
  }
}

现在的问题是应用程序将加载并启动,但是没有一个小部件将正确更新。您可以单击该按钮,它会显示 AlertDialog,AlertDialog 的文本会发生变化,但 Activity 中的文本字段不会更改,并且 ImageView 在任何时候都不会从它开始的位置更改到它应该更改为的那个。

所以我很困惑。如果我遗漏了一些重要的东西,我可以发布更多关于项目设置的信息,但我什至不确定发生了什么问题,所以我不确定我的问题中还包括什么。

4

2 回答 2

2
final View creatureDetailView = this.getLayoutInflater().inflate(
        R.layout.activity_creature_detail, null);

将 Activity 的布局膨胀到基本上没有,只是返回它膨胀的 View。setContentView是实际上将您的布局膨胀到 Activity 的视图层次结构中的原因。

一旦你膨胀你的布局,你就不需要再做一次了。只需在findViewById不引用悬空未附加视图的情况下使用。

将您的 refreshDisplay 方法更改为:

public void refreshDisplay()
{
    final EditText nameField = (EditText) findViewById(R.id.textbox_creature_name);
    nameField.setText(creature.getName());

    final ImageView damageBox0 = (ImageView) findViewById(R.id.damageBox0);
    damageBox0.setImageResource(R.drawable.__n);
    // in the full program this does the same for 0 through 9, but this is a sample
    // also, in the full program, this is a dynamic lookup for the correct pic
    // but again, this is just a sample version.
}
于 2013-04-14T04:22:06.917 回答
1

什么都没有改变,因为你做的完全错了。

如果您希望更新当前活动的任何视图元素,您可以这样做

View v = findViewById(R.id.element);
v.setText("text");

这只是一个简单的例子。您需要将返回的元素转换为正确的类型,以便能够访问所有可用的方法。

你做错了什么是试图再次膨胀布局。

于 2013-04-14T04:23:45.487 回答