如何使用一组代码拥有多个微调器

时间:2012-07-06 22:59:33

标签: java android spinner relativelayout

全部 - 我有一个如下所示的布局: enter image description here

我的目标是在所有行上放置这三个微调器。现在他们只在圣詹姆斯(是的,这是垄断)。每个微调器都有大量的代码,并且从头开始为每一行创建一个全新的微调器是最困难的。我试图复制第一行并只更改文本:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <RelativeLayout android:id="@+id/stjameslay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
        android:id="@+id/st_james_place"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/st_james" 
        android:padding="5dp"
        android:textSize="6pt" />

      <Spinner android:id="@+id/owner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="true"         
        android:layout_toRightOf="@id/st_james_place" 
        android:layout_alignBaseline="@id/st_james_place" />
     <Spinner android:id="@+id/houses"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="true" 
        android:layout_toRightOf="@id/owner"
        android:layout_alignBaseline="@id/st_james_place" />
     <Spinner android:id="@+id/hotels"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="true" 
        android:layout_toRightOf="@id/houses"
        android:layout_alignBaseline="@id/st_james_place" />   
    </RelativeLayout>

    <RelativeLayout android:id="@+id/balticavelay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/stjameslay">

        <TextView
        android:id="@+id/st_james_place"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/baltic" 
        android:padding="5dp"
        android:textSize="6pt" />

      <Spinner android:id="@+id/owner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="true"         
        android:layout_toRightOf="@id/st_james_place" 
        android:layout_alignBaseline="@id/st_james_place" />
     <Spinner android:id="@+id/houses"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="true" 
        android:layout_toRightOf="@id/owner"
        android:layout_alignBaseline="@id/st_james_place" />
     <Spinner android:id="@+id/hotels"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="true" 
        android:layout_toRightOf="@id/houses"
        android:layout_alignBaseline="@id/st_james_place" />   
    </RelativeLayout>

    <RelativeLayout android:id="@+id/boardwalklay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/balticavelay">

      <TextView
        android:id="@+id/st_james_place"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/boardwalk" 
        android:padding="5dp"
        android:textSize="6pt" />

      <Spinner android:id="@+id/owner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="true"         
        android:layout_toRightOf="@id/st_james_place" 
        android:layout_alignBaseline="@id/st_james_place" />
     <Spinner android:id="@+id/houses"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="true" 
        android:layout_toRightOf="@id/owner"
        android:layout_alignBaseline="@id/st_james_place" />
     <Spinner android:id="@+id/hotels"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="true" 
        android:layout_toRightOf="@id/houses"
        android:layout_alignBaseline="@id/st_james_place" />   
    </RelativeLayout>           
</RelativeLayout>

从屏幕截图中可以看出,微调器没有显示出来。我的想法是,由于旋转器上的id是相同的,Java代码只会将额外的微调器视为重复。有没有办法做到这一点,或者我将不得不为每一行和新的Java代码(owner2,houses2,hotels2等)制作新的微调器?感谢您的时间和精力!

3 个答案:

答案 0 :(得分:1)

在我看来,你实际上需要以ListView的方式做到这一点。创建“列表项”布局文件以表示单个列表行,例如......

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/propertyLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView android:id="@+id/propertyName"
        ... />
    <Spinner android:id="@+id/owner"
        ... />
    <Spinner android:id="@+id/houses"
        ... />
    <Spinner android:id="@+id/hotels"
        ... />   
</RelativeLayout>

然后,您需要创建自定义Adapter以将数据映射/绑定到每个窗口小部件,并将其与ListView一起使用。

答案 1 :(得分:0)

你已经在那里回答了你的问题:第二行微调器指的是第一行的id。如果您希望将它们唯一地放在RelativeLayout中,并且您希望在活动代码中查找它们,则所有微调器ID必须是唯一的。

从@ + id / st_james_place到@ + id / textBaltic定义第二行textview的新id,然后旁边的微调器现在可以更改为android:layout_toRightOf =“@ id / textBaltic”和android:layout_alignBaseline =“@ id / textBaltic”,然后将微调器的id更改为@ + id / spinnerBalticOwner,下一个微调器可以像这样引用它:android:layout_toRightOf =“@ id / spinnerBalticOwner”。

对下一行中的所有当前行旋转器和微调器执行此操作,并且所有旋转器都应正确显示。

要在循环中初始化微调器:

int[] spinnerIds = new int[] {R.id.owner, R.id.houses, R.id.hotels, R.id.owner2, R.id.houses2, R.id.hotels2, R.id.owner3, R.id.houses3, R.id.hotels3};

for (int i = 0; i < spinnerIds.length; i++) {
   Spinner spinner = (Spinner) findViewById(spinnerIds[i]);
   // standard spinner initialization code
   if (spinner.getTag().equals("owner")) {
     // init spinner based on owner spinner
   } else if (spinner.getTag().equals("houses")) 
     // init spinner based on houses spinner
   } else if (spinner.getTag().equals("hotels")) {
     // init spinner based on hotels spinner
  } 

}

然后在您的布局中,您需要向所有微调器添加'android:tag',将tag ='owner'添加到第一列微调器,将tag ='houses'添加到第二列,将tag ='hotels'添加到第三栏:

  <Spinner android:id="@+id/owner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:tag="owner"
    android:drawSelectorOnTop="true"         
    android:layout_toRightOf="@id/st_james_place" 
    android:layout_alignBaseline="@id/st_james_place" />
 <Spinner android:id="@+id/houses"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:tag="houses"
    android:drawSelectorOnTop="true" 
    android:layout_toRightOf="@id/owner"
    android:layout_alignBaseline="@id/st_james_place" />
 <Spinner android:id="@+id/hotels"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:tag="hotels"
    android:drawSelectorOnTop="true" 
    android:layout_toRightOf="@id/houses"
    android:layout_alignBaseline="@id/st_james_place" />   
</RelativeLayout>

为了实现这一点,所有的微调器ID都必须是唯一的,我的例子只是将行号附加到原始ID,例如R.id.owner(第1行),R.id.owner2(第2行),R.id.owner3(第3行)。

答案 2 :(得分:0)

我没试过这个,但从理论上讲,它应该可行。

我会将spinner设置分解为单独的xml布局,然后在xml中使用include将其添加到每个父(属性)布局。

然后你可以通过从父视图引用它们来设置微调器,即使它们具有相同的id(很像列表行的工作方式)。

RelativeLayout boardwalk = (RelativeLayout) findViewById(R.id.boardwalklay);
Spinner boardwalkowner = (Spinner) boardwalk.findViewById(R.id.owner)
// set your spinner here
// do the same for the other two spinners
// repeat for each property

如果每个微调器实际上是相同的但是对于父级,则创建一个方法来填充它们,并在获得对特定微调器的引用后调用该方法。

然后在onItemSelected中抓取对父级的引用,您可以将它与每个单独的空间相关联。