我发现我有一个频繁的使用模式,我把一串丑陋的getChildAt(index)
电话串在一起。我的代码可能如下所示:
查看层次结构:
LinearLayout
LinearLayout
EditText
EditText
/LinearLayout
LinearLayout
Button
Button
/LinearLayout
/LinearLayout
丑陋的代码:
layout = (LinearLayout) inflater.inflate(R.layout.dialog_createbuddy, null);
String number =
((TextView) ((LinearLayout) layout.getChildAt(0)).getChildAt(1)).getText().toString();
在我的软件开发经验的指导下,这感觉不对。
1 :神奇的数字没有可读的语义。 0
是CheckBox
或TextView
并且1
是其他小部件并不容易明显,这些数字在不同的上下文中可能有不同的含义(布局)
2 :如果有人要更改布局,所有数字都可能无效
3 :调用链接和强制转换很丑陋,很容易搞砸。
这是一个更完整的代码示例:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/create_buddy_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="5"
android:hint="Name" />
<EditText
android:id="@+id/create_buddy_num"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="5"
android:hint="Number"
android:inputType="number|phone" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
style="?android:attr/buttonBarStyle" >
<Button
android:id="@+id/cancelBuddyBtn"
android:text="Cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
style="?android:attr/buttonBarButtonStyle" />
<Button
android:id="@+id/createBuddyBtn"
android:text="Create"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
style="?android:attr/buttonBarButtonStyle" />
</LinearLayout>
</LinearLayout>
然后我有一个DialogFragment:
public class CreateBuddyDialog extends DialogFragment
{
...
public Dialog onCreateDialog(Bundle savedInstanceState)
{
...
layout = (LinearLayout) inflater.inflate(R.layout.dialog_createbuddy, null);
Button button = (Button) ((LinearLayout) layout.getChildAt(1)).getChildAt(1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
String name =
((TextView) ((LinearLayout) layout.getChildAt(0)).getChildAt(0)).getText().toString();
String number =
((TextView) ((LinearLayout) layout.getChildAt(0)).getChildAt(1)).getText().toString();
addBuddiesActivity.createBuddyConfirmed(new Buddy(name, number));
}
});
答案 0 :(得分:1)
正确的做法是使用findViewById()
并确保要获取引用的视图具有在XML中指定的ID。例如,
View layout = inflater.inflate(R.layout.dialog_createbuddy, null);
EditText createBuddyName = (EditText) view.findViewById(R.id.create_buddy_name);
Button createBtn = (Button) view.findViewById(R.id.createBuddyBtn);
// now you can mess with these views