覆盖onFinishInflate()方法

时间:2013-07-06 09:32:12

标签: android layout-inflater

我正在使用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监听器,即button1inInflatedRowbutton2inInflatedRow执行相同的功能,但我需要知道哪个按钮调用了该功能。那么,如何为这些按钮调用findVieById()?或者是否有其他方式来调用按钮onclick ..?

4 个答案:

答案 0 :(得分:3)

您不需要onFinishInflate()。调用inflate()会返回新创建的视图。只需在视图上使用findViewById()逐个按钮的ID,并在每个按钮上设置OnClickListener。

答案 1 :(得分: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)

答案 2 :(得分: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()...

答案 3 :(得分:0)

准确回答您的问题:

  

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

答案在View或ViewGroup子类中。

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

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

现在代码。

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

android:onClick="ButtonClickFunction"

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

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

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

当然,您可以随意更改“ButtonClickFunction”名称。您可以详细了解我的建议herehere.

希望这会有所帮助......