我正在尝试设置一个活动,当我尝试将我的一些视图分配给.java文件中的名称时,它告诉R.layout.bathing没有字段datePicker1,它确实拥有它。这是我的两个代码片段。我应该改变什么才能让它发挥作用?
bathing.java
setContentView(R.layout.bathing);
setTitle("Please Select Bathing Options");
bathdate = (DatePicker)findViewById(R.layout.bathing.datePicker1);
bathtime = (TimePicker)findViewById(R.layout.bathing.timePicker1);
add = (Button)findViewById(R.layout.bathing.button1);
bathing.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:gravity="center"
android:text="@string/bath_tracking"
android:textAppearance="?android:attr/textAppearanceLarge" />
<DatePicker
android:id="@+id/datePicker1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView3"
android:layout_marginTop="16dp" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/datePicker1"
android:layout_marginTop="51dp"
android:text="@string/date"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TimePicker
android:id="@+id/timePicker1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/datePicker1"
android:layout_below="@+id/datePicker1" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/timePicker1"
android:layout_alignParentLeft="true"
android:layout_marginBottom="50dp"
android:text="@string/time"
android:textAppearance="?android:attr/textAppearanceLarge" />
<RadioGroup
android:id="@+id/radioGroup1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/timePicker1"
android:orientation="vertical" >
<RadioButton
android:id="@+id/radioButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Yes" />
<RadioButton
android:id="@+id/radioButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/radioGroup1"
android:layout_below="@+id/radioGroup1"
android:text="@string/No" />
</RadioGroup>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/radioGroup1"
android:layout_alignParentLeft="true"
android:layout_marginBottom="36dp"
android:text="@string/hair"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/timePicker1"
android:layout_alignParentRight="true"
android:layout_below="@+id/radioGroup1"
android:inputType="textMultiLine" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText1"
android:layout_centerHorizontal="true"
android:text="@string/Add"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/editText1"
android:layout_alignBottom="@+id/editText1"
android:layout_alignParentLeft="true"
android:text="@string/comment"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
答案 0 :(得分:4)
您必须通过ID来访问视图对象,而不是
bathdate = (DatePicker)findViewById(R.layout.bathing.datePicker1);
使用
bathdate = (DatePicker)findViewById(R.id.datePicker1);
等等。 ID是全局的,它们不是特定于某个布局。
这并不一定意味着每个视图都必须具有唯一的名称。最重要的是要知道findViewById()
仅在当前活动的视图层次中搜索(您可以通过在setContentView()
之前调用它来尝试此操作 - 它将会总是返回null)。最后,这意味着ID在单个布局文件中应该是唯一的。
在多个布局中使用相同的ID没有问题。通常它甚至有用。考虑在res/layout/main.xml
中使用正常布局的活动,在res/layout-land/main.xml
中使用不同的横向格式布局。 Android将为您管理这些布局。如果您为相同目的的视图提供不同的唯一ID,则必须在代码(伪代码示例)中执行此操作:
if(layout == portrait)
view = findViewById(R.id.viewid_portrait);
else if(layout == landscape)
view = findViewById(R.id.viewid_landscape);
如果两者具有相同的ID,则不会发生冲突,但可以通过findViewById()
的单行调用访问这两者。