0

ここにあるのはカスタム ビューで、いくつかのウィジェットをそれに合わせたいと考えています。

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

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

</com.zone.manager.Tab3>

今、そのボタンをonclicklistenerに設定して、Viewクラスでそれを操作できるようにしたいので、これを行いました...

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


  addZone.setOnClickListener(this);

私はそれを

public class Tab3 extends ViewGroup implements OnTouchListener, OnClickListener
    Public Tab3(Context context, AttributeSet attrs) 
    {
    super (context, attrs); 
    // here
    }

ViewGroup を拡張すると、これを実装するようになりました

@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) 
    {
        // TODO Auto-generated method stub

    }

この作業を行うためにここに入れることをサポートしているものはありますか?

しかし、アプリを実行しようとするとクラッシュしますが、//addZone.setOnClickListener(this);アプリを正常に実行すると、何か助けになりますか?

タブ

        th.setup();
        TabSpec specs = th.newTabSpec("tag0");
        specs.setContent(R.id.connecttionTab);
        specs.setIndicator("Connection Tab");
        th.addTab(specs);
        specs = th.newTabSpec("tag1");
        specs.setContent(R.id.tab1);
        specs.setIndicator("Zone Manager");
        th.addTab(specs);
        specs = th.newTabSpec("tag2");
        specs.setContent(R.id.tab2);
        specs.setIndicator("",res.getDrawable(R.drawable.ic_tab_vaccontrol));
        th.addTab(specs);
        //this is the tab that has all this vvv
        specs = th.newTabSpec("tag3");
        specs.setContent(R.id.tab3);
        specs.setIndicator("Graphical Layout");
        th.addTab(specs);
4

2 に答える 2

3

xml では、カスタム ビューにボタンが含まれていません。兄弟ビューです。アプリがクラッシュする理由findViewById(R.id.addZone)は が返さnullれるため、NullPointerExceptionを呼び出すと が返されますaddZone.setOnClickListener(this)。カスタム ビューにボタンを含める場合、xml は次のようにする必要があります。

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

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

</com.zone.manager.Tab3>

また、クラスはではなくTab3を拡張する必要があります。レイアウトを行うためのコードも記述する必要があるため、これは少し複雑になる可能性があります。ボタンもビュー内に表示されます。ViewGroupViewTab3

編集

あなたがやろうとしていることについてのコメントに基づいて、上記のアプローチはお勧めしません。代わりに、カスタム ビューと Button をLinearLayout. たとえば、次のレイアウトでは、ボタンが画面の左下に配置され、Tab3 ビューがその上の領域を埋めます。

res/layout.tab3.xml

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

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

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

</LinearLayout>

次に、クリック処理ロジックをクラスTab3に表示される別のメソッドに移動しますActivity。(それが と呼ばれていると仮定しましょうaddZone()。)Tab3クラスは実装OnClickListenerしてはならず、拡張する必要がありますView(ViewGroup上記とは異なります)。ボタンに属性を追加することで、ボタンandroid:onClickに を追加する必要がなくなりOnClickListenerます。代わりに、その名前のクリック メソッドをアクティビティに実装する必要があります。

private Tab3 mTab3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab3);
    mTab3 = (Tab3) findViewById(R.id.tab3_display);
    // . . .
}

@Override
/**
 * Called when a view with attribute android:onClick="onAddZone"
 * is clicked.
 *
 * @param view the view that was clicked.
 */
public void onAddZone(View view) {
    mTab3.addZone();
}

ボタンに関するコードは何もありませんがonAddZone、ボタンがクリックされたときにアクティビティのメソッドが呼び出されるように、フレームワークはリフレクションを使用してすべてを自動的に結び付けます。

于 2012-06-10T02:52:51.470 に答える