获取嵌套级别视图的最佳方法是不重复链接getChildAt()

时间:2014-05-31 06:42:14

标签: android

我发现我有一个频繁的使用模式,我把一串丑陋的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 :神奇的数字没有可读的语义。 0CheckBoxTextView并且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));
    }
});

1 个答案:

答案 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