2

私はデータベースを持っています。データベースの値がリストビューに表示されます。リストビューには、ビットマップ、4 つの TextView、および 2 つのボタンがあります。2 つのボタンに対して 2 つの異なる OnClickListeners を作成しましたが、どちらの方法も成功しません。ボタンをクリックすると、「tvText1.setText(...)」を実行しようとすると、プログラムがクラッシュします。

誰かがそれを修正する方法を知っていますか?

xml ファイルのボタンは次のようになります。

<Button android:id="@+id/buttonON" 
        android:gravity="center"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true" 
        android:focusable="false"
        android:onClick="btnButtonONclicked"
        android:text="ON" />

<Button android:id="@+id/buttonOFF" 
        android:gravity="center"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true" 
        android:focusable="false"
        android:text="OFF" />

これは私の CursorAdapter です

public class ModuleCursorAdapter extends ResourceCursorAdapter implements OnClickListener {

    public ModuleCursorAdapter(Context context, Cursor cur) {
        super(context, R.layout.notes_row, cur);
    }

    @Override
    public View newView(Context context, Cursor cur, ViewGroup parent) {
        LayoutInflater li = LayoutInflater.from(context);
        return li.inflate(R.layout.notes_row, parent, false);
    }

    @Override
    public void bindView(View view, Context context, Cursor cur) {        
        TextView tvText1 = (TextView)view.findViewById(R.id.text1);
        TextView tvText2 = (TextView)view.findViewById(R.id.text2);
        TextView tvText3 = (TextView)view.findViewById(R.id.text3);
        TextView tvText4 = (TextView)view.findViewById(R.id.text4);
        ImageView ivIcon = (ImageView)view.findViewById(R.id.icon);
        Button btnButtonON = (Button)view.findViewById(R.id.buttonON);
        Button btnButtonOFF = (Button)view.findViewById(R.id.buttonOFF);

        tvText1.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_TITLE)));
        tvText2.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICETYPE)));
        tvText3.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_HOMECODE)));
        tvText4.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICECODE)));

        String filename = "modul_r_" + cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICETYPE));
        int id = context.getResources().getIdentifier(filename, "drawable", "com.module.main");     
        ivIcon.setImageBitmap(BitmapFactory.decodeResource(context.getResources(), id));            

        btnButtonON.setTag(id);

        btnButtonOFF.setTag(id);
        btnButtonOFF.setOnClickListener(btnButtonOFFclicked);
    }
    @Override
    public void onClick(View view) {

    }       

     public void btnButtonONclicked(View view) {
         TextView tvText1 = (TextView)view.findViewById(R.id.text1);
            tvText1.setText("On");
     }


    private OnClickListener btnButtonOFFclicked = new OnClickListener() {
        @Override
        public void onClick(View view) {
            TextView tvText1 = (TextView)view.findViewById(R.id.text1);
            tvText1.setText("Off");
        }
    };
}

ご協力ありがとうございました。

乾杯

フェリックス

コメント。

レイアウトファイル全体

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal">

<ImageView
    android:id="@+id/icon"
    android:scaleType="centerCrop"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="10dp"
    android:src="@drawable/my_icon"/>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:orientation="vertical">



    <TextView android:id="@+id/text1"
        android:textSize="22dp"
        android:layout_width="170dp"
        android:layout_height="wrap_content"/>

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

        <TextView android:text="Code: " 
            android:textSize="15dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView android:id="@+id/text2"
            android:textSize="15dp"
            android:paddingLeft="12dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView android:id="@+id/text3" 
            android:textSize="15dp"
            android:paddingLeft="12dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView android:id="@+id/text4"
            android:textSize="15dp"
            android:paddingLeft="12dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>

<Button android:id="@+id/buttonON" 
        android:gravity="center"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true" 
        android:focusable="false"
        android:onClick="btnButtonONclicked"
        android:text="ON" />

<Button android:id="@+id/buttonOFF" 
        android:gravity="center"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true" 
        android:focusable="false"
        android:text="OFF" />

コメント コメント:

今、私は tv.Text1.setText("On") を削除しました。オンボタンについては、まだ例外があります。オフボタンの場合は、system.out.println() がうまく機能しています。

これはコードの一部です:

         public void btnButtonONclicked(View view) {
         //  Still an exeption thrown
     }


    private OnClickListener btnButtonOFFclicked = new OnClickListener() {
        @Override
        public void onClick(View view) {
            System.out.println("Hello. Here is the message.");
            //  working fine
        }
    };
4

4 に答える 4

3

TextView はどこにありますか? または、もっと良いかもしれません: レイアウト ファイル全体を見せていただけますか?

どちらの OnClickListeners にも View 参照が渡されますが、ドキュメントで読むことができるように、引数はクリックされたビューです。つまり、ボタンへの参照になります。ボタンには、探しているテキストビューが含まれていないことは間違いありません。

TextView tvText1 = (TextView)view.findViewById(R.id.text1);

何も見つからず、tvText1になりますnull。それが nullpointer の発生元であり、アプリがクラッシュする理由です。

// 編集: 以下のコメントに記載されている内容を説明するためのコード。

@Override
public void bindView(View view, Context context, Cursor cur) {        
    ....

    btnButtonON.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            tvText1.setText("Off");
        }
    );
    btnButtonOFF.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            tvText1.setText("Off");
        }
    );
}

ところで、状態を追跡するボタンを探している場合は、ToggleButton「オン」と「オフ」に設定できる をご覧ください。

于 2011-12-04T18:30:48.647 に答える
0

後で使用できる親への参照を保持します。

それで..

public class ModuleCursorAdapter extends ResourceCursorAdapter 
 implements OnClickListener {

View mView = null;

public void bindView(View view, Context context, Cursor cur) { 

   mView = view;
   ...
}

その後

 public void btnButtonONclicked(View view) {
     TextView tvText1 = mView.findViewById(R.id.text1);
        tvText1.setText("On");
 }
于 2011-12-04T20:19:39.617 に答える
0

Button onClick Listener のクラス レベル フィールドとして tvText1 を作成します。

class MyListener extends OnClickListener{
    private TextView tvText1;
    public MyListener(TextView tv) {
        this.tvText1 = tv;
    }
    public void onClick(View v) { 
        tvText1.setText("OFF");

    }

}


@Override
public void bindView(View view, Context context, Cursor cur) {        
    TextView tvText1 = (TextView)view.findViewById(R.id.text1);
    TextView tvText2 = (TextView)view.findViewById(R.id.text2);
    TextView tvText3 = (TextView)view.findViewById(R.id.text3);
    TextView tvText4 = (TextView)view.findViewById(R.id.text4);
    ImageView ivIcon = (ImageView)view.findViewById(R.id.icon);
    Button btnButtonON = (Button)view.findViewById(R.id.buttonON);
    Button btnButtonOFF = (Button)view.findViewById(R.id.buttonOFF);

    tvText1.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_TITLE)));
    tvText2.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICETYPE)));
    tvText3.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_HOMECODE)));
    tvText4.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICECODE)));

    .....

    btnButtonON.setTag(id);

    btnButtonOFF.setTag(id);
    MyListener listener = new MyListener(tvText1);

    btnButtonOFF.setOnClickListener(listener);
于 2011-12-04T18:37:10.757 に答える
0

以下を試してください

TextView tvText1 = (TextView)view.getParent().findViewById(..)
于 2011-12-04T18:08:51.073 に答える