全部 - 我有一个如下所示的布局:
我的目标是在所有行上放置这三个微调器。现在他们只在圣詹姆斯(是的,这是垄断)。每个微调器都有大量的代码,并且从头开始为每一行创建一个全新的微调器是最困难的。我试图复制第一行并只更改文本:
<?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等)制作新的微调器?感谢您的时间和精力!
答案 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
中抓取对父级的引用,您可以将它与每个单独的空间相关联。