在视图类中查找窗口小部件的ID

时间:2012-06-10 15:52:32

标签: java android xml view android-widget

我所拥有的是几乎占据整个屏幕的画布,然后我想要一排按钮和其他一些小部件。所以我这样做了。

XML Code
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_height="match_parent" >

<com.zone.manager.Tab3
    android:id="@+id/tab3_display"
    android:layout_width="fill_parent"
    android:layout_height="620dp" />

     <LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="match_parent" >   

        <Button
            android:id="@+id/addZone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add Zone" />

        <Button
            android:id="@+id/helpZone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Help" />



        <SeekBar
            android:id="@+id/seekBar1"
            android:paddingTop="9dp"
            android:layout_width="179dp"
            android:layout_height="wrap_content" />

    </LinearLayout>

Java代码

public class Tab3 extends View implements OnTouchListener, OnClickListener {
  public Tab3(Context context, AttributeSet attrs) {
    View parent = (View) getParent();
    addZone = (Button) parent.findViewById(R.id.addZone);
    addZone.setOnClickListener(this);
  }

    @Override
      protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        . . . draws a bunch of stuff
      }
    @Override
      public void onClick(View v) {
        switch (v.getId()) {
          case R.id.addZone:
            String w = "W~20~0~0~0~0~0";
            Log.d("ZoneSize", "Zone set");
            MyApplication.preferences.edit().putString( "ZoneSize", w ).commit();
            MyApplication.preferences.edit().putBoolean("ZoneSizeReady", true).commit();
            break;
        }
      }

但是我的问题是我认为代码没有重新确定addZone的位置。因为当我有addZone.setOnClickListener活动时,我的程序会崩溃,但是当我没有激活时,布局看起来就像我想要的那样。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:0)

 addZone = (Button) findViewById(R.id.addZone);

addZone将 null ,因为com.zone.manager.Tab3没有任何子女

很明显,你的代码会崩溃

因此,您要么提供 com.zone.manager.Tab 子项,这些子项还需要将基类从View更改为ViewGroup,

或者您从 com.zone.manager.Tab 父级开始。像

这样的东西
 View parent = (View) getParent ();
 addZone = (Button) parent.findViewById(R.id.addZone);

答案 1 :(得分:0)

我有一些提示可以让你避免这些奇怪的错误和其他:

自定义视图的代码依赖于使用自定义视图的xml布局。 这是糟糕的编码。

相反,您应该使用LayoutInflater,为其自定义视图使用布局xml文件,然后执行“findViewById”并将clickListeners添加到您希望的任何视图内。

我认为将自定义视图设置为保存其他视图的单击侦听器而不检查其中哪些被单击也是错误的。要么添加一个检查,要么为每个人添加一个不同的监听器(我个人更喜欢)。