0

メインアクティビティにリストビューがあり、その後にテキストビューが続きます。リスト ビューにはボタンが含まれています。リスト内のボタンをクリックすると、textatrea にテキストが表示されます。しかし、ボタンのクリックをキャプチャできません。

以下は私が使用したコードです。何が悪いのか教えてください。(代替ソリューションは必要ありませんが、コードの何が問題なのか知りたいです)

public class MyFirstAppActivity extends Activity implements OnItemClickListener {   
    ListView listview ;
    String[] array = new String[] {"Click1","Click2"};
    ArrayAdapter <String> arrayadapter;
    TextView textview;


    public void onCreate(Bundle savedInstance){
        super.onCreate(savedInstance);
        setContentView(R.layout.main);
        arrayadapter = new ArrayAdapter<String>(this, R.layout.button,array);
        listview = (ListView)findViewById(R.id.lv_1);
        listview.setAdapter(arrayadapter);
        listview.setOnItemClickListener(this);
    }


    public void onItemClick(AdapterView<?>arg1,View v,int Position, long id){
        textview = (TextView)findViewById(R.id.textview);
        textview.setText("Hello, you just clicked a button"+Position);      
    }
}

これにより、以下に示すようにアクティビティが main.xml に設定されます。しかし、リストのボタンをクリックすると、クリックがキャプチャされません。これはなぜですか?

main.xml:

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

            <ListView android:id="@+id/lv_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">        
            </ListView>

            <TextView android:id = "@+id/textview"
                    android:layout_width = "match_parent"
                    android:layout_height = "match_parent"
                    android:layout_below = "@id/lv_1"
                    android:text="Message about the button is displayed here">        
            </TextView>"


        </RelativeLayout>

ボタン.xml

<?xml version="1.0" encoding="utf-8"?>

<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/button" >    
</Button>
4

2 に答える 2

1

あなたはあることを言って、別のことをコーディングしています...

onItemClickボタンではなく、リストの行のクリックを処理します。

この場合、ボタンは行からクリックを盗んでいるため、 onItemClick は呼び出されていません。

これを修正するには、実際に何をしたいかによって、2 つのオプションがあります。

行ではなくボタン自体をクリックしたい場合getViewは、アダプターのメソッドをオーバーライドしOnClickListenerて、ボタンの を配置する必要があります。

行をクリックするだけで満足している場合 (行にはボタンしかないため、ボタンをクリックしたように見えます)、ボタンがリスト行からクリックを盗むのを止める必要があります。xml のボタンにandroid:focusable="false"とを設定することで、それを実現できます。android:focusableInTouchMode="false"

そんなことしたらNPEになってしまう…

R.id.textview行レイアウトにないため、null が返され、setText が失敗するonItemClickため、NPE がスローされます。findViewByIdクリックした行から親レイアウトに移動してから、テキストビューを見つける必要があります (メソッドから行う場合もほとんど同じですgetView...

メソッドに固執すると仮定しますOnItemClick

    public void onItemClick(AdapterView<?>arg1,View v,int Position, long id){ 
        ListView lv = (ListView) v.getParent();
        RelativeLayout rl = (RelativeLayout) lv.getParent();
        textview = (TextView) rl.findViewById(R.id.textview); 
        textview.setText("Hello, you just clicked a button"+Position);       
    } 
于 2012-10-13T13:26:56.993 に答える
0

このコードandroid:descendantFocusability="blocksDescendants"をリストビューの子 xml に入れます。

于 2012-10-13T12:23:55.967 に答える