唯一标识android Compound View中的元素

时间:2014-05-08 05:32:49

标签: android android-custom-view

问题:如何唯一地识别android复合视图中的元素?

背景 在我的应用程序中,我使用了Compound View。因为它有两个TextFields,每行有一个图像和一个搜索栏。布局工作正常。

因此在布局中有两个单独的搜索栏。我需要在我的活动中获得它们的价值。

我可以分别识别每一行,因为它们有id。但是行内的项目在每一行中重复。

我的问题是 如何唯一识别每个搜索栏?

row_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

       <RelativeLayout
            android:id="@+id/colunm"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="40sp" >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginLeft="6dip"
                android:layout_marginRight="6dip"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="marquee"
                android:fadingEdge="horizontal"
                android:singleLine="true"
                android:textAppearance="?android:attr/textAppearanceMedium" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:maxLines="1"
                android:textAppearance="?android:attr/textAppearanceSmall" />

            <SeekBar
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
        </RelativeLayout>

    </merge>

screen_layout.xml

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >


        <com.example.test.view.Compound
            android:id="@+id/vol_Row1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            custom:column_summary="TEST SUMMARY I"
            custom:column_title="Test TITLE 1"
            custom:image_Icon="@drawable/ic_action1" />

        <com.example.test.view.Compound
            android:id="@+id/vol_Row2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            custom:column_summary="TEST SUMMARY 2"
            custom:column_title="Test TITLE 2"
            custom:image_Icon="@drawable/ic_action2" />
    </LinearLayout>

row_layout class

    public Compound(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a=context.obtainStyledAttributes(attrs,R.styleable.Options, 0, 0);
        String titleText=a.getString(R.styleable.Options_title);
        String summaryText=a.getString(R.styleable.Options_summary);
        int icon=a.getInt(R.styleable.Options_image_Icon,0);

        a.recycle();

        LayoutInflater inflater=(LayoutInflater)   context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.row_layout,this,true);

        imageView=getChildAt(0);
        imageView.setImageResource(icon);

        title=getChildAt(1)
        title.setText(titleText);

        summary=getChildAt(2)
        summary.setText(summaryText);

    }
}

2 个答案:

答案 0 :(得分:2)

首先,在XML布局文件中向搜索栏添加ID。

<SeekBar
            android:id="@+id/seek"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

其次,在您的代码中,在findViewById视图的实例上使用Compound,您希望获取对其搜索栏的引用:

Coumpund c1 = (Compound)findViewById(R.id.vol_Row1);
Coumpund c2 = (Compound)findViewById(R.id.vol_Row2);

SeekBar sb1 = (SeekBar)c1.findViewById(seek); // Gives you the SeekBar of c1
SeekBar sb2 = (SeekBar)c2.findViewById(seek); // Gives you the SeekBar of c2

答案 1 :(得分:0)

我是这样做的。在复合视图中,我为每个元素提供了唯一的ID。然后在测试代码中,我可以像这样唯一地访问它们,

private View inflaterView;
    LayoutInflater i=(LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflaterView=i.inflate(R.layout.screen_layout, null);
        seekBar=(SeekBar) inflaterView.findViewById(R.id.vol_Row1).findViewById(R.id.seekbar);