什么相当于在Android中使用LayoutInflater的findViewById?

时间:2012-11-25 09:43:27

标签: android layout-inflater

虽然我在我的项目中使用了它,但我并不完全了解LayoutInflater函数。对我而言,当我无法调用 findViewById 方法时,它只是一种查找视图的方法。但有时它并不像我期望的那样有效。

我有这个非常简单的布局(main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:id="@+id/layout">
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Hello World, MyActivity"
            android:id="@+id/txt"/>

    <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Change text"
            android:id="@+id/btn"/>
</LinearLayout>


我想要的非常简单 - 只需在按下按钮时更改TextView中的文本。一切都很好,就像这样

public class MyActivity extends Activity implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        TextView txt = (TextView) findViewById(R.id.txt);
        double random = Math.random();
        txt.setText(String.valueOf(random));
    }
}

但我想了解使用 LayoutInflater 的等价物?我试过这个,但没有成功,TextView没有改变它的值

@Override
public void onClick(View view) {
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View main = inflater.inflate(R.layout.main, null);
    TextView txt = (TextView) main.findViewById(R.id.txt);
    double random = Math.random();
    txt.setText(String.valueOf(random));
}

但是在调试时我可以看到每个变量都填充了正确的值。我的意思是 txt 变量实际上包含TextView,其值为“Hello World,MyActivity”,并且在 setText 方法之后它包含一些随机数,但我无法在UI上看到此更改。这是我在项目中遇到LayoutInflater的主要问题 - 由于某种原因,我无法更新膨胀的视图。为什么呢?

1 个答案:

答案 0 :(得分:3)

  

对我而言,当我无法调用findViewById时,它只是一种查找视图的方法   方法

这是不正确的。 LayoutInflater用于从提供的xml布局文件中扩展(构建)视图层次结构。使用第二个代码段,您可以从布局文件(R.layout.main)构建视图层次结构,从该膨胀的视图中找到TextView并在其上设置文本。问题是这个膨胀的视图没有附加到Activity的visibile UI。您可以看到更改,例如,如果再次调用setContentView,这次给它增加了视图。这会使Activity的内容成为新增的View

LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View main = inflater.inflate(R.layout.main, null);
TextView txt = (TextView) main.findViewById(R.id.txt);
double random = Math.random();
txt.setText(String.valueOf(random));
setContentView(main);