1

我正在使用LayoutInflater我想要的这个视图多次(动态地)膨胀一个xml。

我的ònCreate`方法如下:

 protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home);
                    v[i]= new View[4];
            LinearLayout linear= (LinearLayout) findViewById(R.id.linearLayout);
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            for(int i = 1; i <4; i++) {

             v[i]= inflater.inflate(R.layout.row, linear);                         //v[i] returns view i.e. Linear Layout from my row.xml 
            }   
        }

我的 row.xml 代码如下 -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#ffaf04"
    android:orientation="horizontal"
    android:padding="10dip" >

    <LinearLayout
        android:id="@+id/rel1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="5dp"
        android:background="#ffffff"
        android:orientation="vertical"
        android:padding="5dp" >

        <ImageView
            android:id="@+id/imageView1inInflatedRow"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:src="@drawable/image_holder" >
        </ImageView>

        <Button
            android:id="@+id/button1inInflatedRow"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginTop="5dp"
            android:background="@layout/button_selector"
            android:padding="5dip"
            android:textColor="#FFFFFF"
            android:textSize="12sp" >
        </Button>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:background="#ffffff"
        android:orientation="vertical"
        android:padding="5dp" >

        <ImageView
            android:id="@+id/imageView2inInflatedRow"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:src="@drawable/image_holder" >
        </ImageView>

        <Button
            android:id="@+id/button2inInflatedRow"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginTop="5dp"
            android:background="@layout/button_selector"
            android:padding="5dip"
            android:textColor="#FFFFFF"
            android:textSize="12sp" >
        </Button>
    </LinearLayout>

</LinearLayout>

现在该行包含按钮,我想为按钮设置一个 onclick 侦听器,即 forbutton1inInflatedRowbutton2inInflatedRowhich 执行相同的功能,但我需要知道哪个按钮调用了该功能。那么,我该如何调用findVieById()这些按钮呢?还是有其他方法可以调用按钮onclick..?

4

4 回答 4

3

你不需要onFinishInflate()。调用以inflate()返回新创建的视图。只需findViewById()在视图上一一使用按钮的 id 并在每个按钮上设置 OnClickListener。

于 2013-07-06T09:58:24.987 回答
1

充气一排的最佳方法(据我所知)如下 -

 View v[i] = inflater.inflate(R.layout.row, null); 
    linear.addView(v[i]);

这个 v 返回 row.xml 中的膨胀视图。因此我们可以访问 Button 作为

photoButton[i]=(Button) v[i].findViewById(R.id.button1inInflatedRow);

我错在哪里---我正在使用

View v[i] = inflater.inflate(R.layout.row, linear);

这个 V[i] 是父布局,因此我无法访问按钮

(Button) v[i].findViewById(R.id.button1inInflatedRow)

于 2013-07-10T09:17:13.583 回答
0

要准确回答您的问题,即:

那么,如何以及在何处覆盖此方法?

答案在 View 或 ViewGroup 子类中。

但是很明显,您正在询问如何在“行”布局中为您的按钮应用侦听器,该布局在 LinearLayout 中“重复”。无需重写此方法即可实现此目的,但有些事情需要清除以获得更好的答案。例如,“行”布局中有多少个按钮?您是否希望每行中的每个按钮都执行相同的操作(调用相同的功能)或者按钮的功能必须不同,让我们说基于它们在哪一行?

我会给你一个关于如何做到这一点的一般想法,但这完全基于我的想法,如果你需要更好的答案,你应该编辑你的问题并提供更多细节,比如你的 xml 文件以及你到底想要做什么。

现在到代码。

在您的“行”xml 布局中,在您的 Button 元素中提供以下属性:

android:onClick="ButtonClickFunction"

然后在你的活动中声明一个这样的函数:

public void ButtonClickFunction(View v) {
    <Your code here>
}

现在,每当单击此按钮(在任何行中)时,都会调用 ButtonClickFunction,并将该按钮作为参数。但是,如果您想要例如基于行号的不同操作,这可能不是最好的方法。

当然,您可以随意更改“ButtonClickFunction”名称。您可以在此处和此处阅读有关我的建议的更多信息

希望这可以帮助...

于 2013-07-06T11:28:13.720 回答
0

据我了解,您的布局R.layout.row包含Buttons,并且您想要添加OnClickListeners到这些Buttons。你不需要重写任何方法来做到这一点。的方法返回你刚刚膨胀inflate()LayoutInflater实例。View然后,您可以使用findViewById()来获取Buttons布局。尝试这样的事情:

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.row, linear);
Button buttonOne = (Button) v.findViewById(R.id.buttonOne);
button.setOnClickListener(new View.OnClickListener()...
于 2013-07-06T10:02:02.940 回答