4

すべてが正常に読み込まれると推測されるように、クリックイベントはトリガーされません。私が始める前に、私はこれについて非常に多くのスレッドを読みました、しかし私は私の人生の間それを理解することができません。これがコードです。

activity_main.xml(リストを呼び出すためのメインレイアウト)

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

     <ListView
         android:id="@android:id/list"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"

         />

</LinearLayout>

list_mainsegments_row.xml(カスタム行)

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

        <ImageView
            android:id="@+id/iconView"
            style="@style/generalPagesLogoStyle"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_margin="@dimen/tendpPadding"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_launcher" />

        <TextView
            android:id="@+id/titleMainSegments"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:layout_weight="0.5"
            android:text="Medium Text"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textSize="@dimen/generalTextSize"
             />

        <ImageButton
            android:id="@+id/imageButton1"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_gravity="center_vertical"
            android:scaleType="fitCenter"
            android:src="@drawable/arrow" />
    </LinearLayout>

MyAdapter.java

   public class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int resource, int textViewResourceId,
            String[] strings) {
        super(context, resource, textViewResourceId, strings);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        // This is a single row
        View row = inflater.inflate(R.layout.list_mainsegments_row, parent,
                false);
        String[] items = getContext().getResources().getStringArray(
                R.array.segments_main);
        ImageView iv = (ImageView) row.findViewById(R.id.iconView);
        TextView tv = (TextView) row.findViewById(R.id.titleMainSegments);
        tv.setText(items[position]);
        organiseLayout(position, items, iv);
        return row;

    }

    private void organiseLayout(int position, String[] items, ImageView iv) {
        if (items[position].equals(getContext().getResources().getString(
                R.string.segment_one))) {
            iv.setImageResource(R.drawable.img1);
        }
        if (items[position].equals(getContext().getResources().getString(
                R.string.segment_two))) {
            iv.setImageResource(R.drawable.img2);
        }
    }
}

MainActivity.java

public class MainActivity extends ListActivity implements OnItemClickListener {

private MyAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAdapter = new MyAdapter(this, android.R.layout.simple_list_item_1,
            R.id.titleMainSegments, getResources().getStringArray(
                    R.array.segments_main));

    setListAdapter(mAdapter);
    getListView().setOnItemClickListener(this);

}

public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
    CharSequence text = "Item clicked";
    int duration = Toast.LENGTH_SHORT;
    Toast toast = Toast.makeText(this, text, duration);
    toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL,
            duration, duration);
    toast.show();
} }

エラーがないため、logCatログは役に立ちません。すべてうまくいきますが、ListViewをタップしてもトーストは表示されません。

編集:

style.xml:

<!-- Global styles -->
    <style name="horizLayoutHolder">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_gravity">center_horizontal</item>
    </style>

    <!-- This is for the text based pages -->
    <style name="general_pages">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">fill_parent</item>
        <item name="android:orientation">vertical</item>
        <item name="android:paddingBottom">@dimen/generalPadding</item>
        <item name="android:paddingLeft">@dimen/generalPadding</item>
        <item name="android:paddingRight">@dimen/generalPadding</item>
        <item name="android:paddingTop">@dimen/tendpPadding</item>
    </style>

    <style name="generalPagesTitleStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginBottom">@dimen/tendpPadding</item>
        <item name="android:textColor">#000</item>
        <item name="android:textSize">@dimen/generalHeadingTextSize</item>
        <item name="android:textStyle">bold</item>
    </style>

    <style name="generalPageScrollView">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

    <style name="generalPageMainText">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#000</item>
        <item name="android:textSize">@dimen/generalSmallFontSize</item>
    </style>

    <style name="generalPagesLogoStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginBottom">@dimen/tendpPadding</item>
"                <item name="android:src">@drawable/mainlogo</item>
    </style>

    <style name="generalActionButton">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">40dp</item>
        <item name="android:layout_gravity">center_horizontal</item>
        <item name="android:textSize">@dimen/generalVerySmallFontSize</item>
        <item name="android:paddingRight">@dimen/generalPadding</item>
        <item name="android:paddingLeft">@dimen/generalPadding</item>
    </style>

    <style name="generalTextBoxes">
        <item name="android:layout_width">250dp</item>
        <item name="android:layout_height">50dp</item>
        <item name="android:layout_gravity">center_horizontal</item>
        <item name="android:ems">10</item>
        <item name="android:textSize">@dimen/generalSmallFontSize</item>
    </style>

    <!-- End of General / Full text based activities -->


    <!-- I have used this in theme.xml -->
    <style name="windowTitleBackgroundStyle">
        <item name="android:background">#CCCCCC</item>
    </style>

    <style name="windowTitleStyle">
        <item name="android:textColor">#000000</item>
        <item name="android:padding">12dip</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">16sp</item>
    </style>
    <!-- End of Theme.xml stuff -->

themes.xml

<style name="Theme.myTheme.TitleBar" parent="android:Theme">
    <item name="android:windowTitleBackgroundStyle">@style/windowTitleBackgroundStyle</item>
    <item name="android:windowTitleStyle">@style/windowTitleStyle</item>
    <item name="android:windowTitleSize">50dip</item>
    <item name="android:background">#F8C845</item>
    <item name="android:textColor">#555</item>
</style>
4

1 に答える 1

12

LinearLayout属性を削除します

android:clickable="true"

XMLファイルlist_mainsegments_row.xmlから、正常に動作するはずです(試したばかりです)。


編集

Button / ImageButtonを含む子を持つListViewのsetOnItemClickListenerメソッドを使用する場合、Button / ImageButtonがイベントを消費するため、メソッドが起動されることはありません。

解決策は、setOnItemClickListener (ListView用)の代わりにsetOnClickListener(すべてのアイテム用)使用することです。

これを行うには、次の方法でOnClickListenerをアダプターに渡すことができます。

アダプタは次のようになります。

private OnClickListener callback;

public class MyAdapter extends ArrayAdapter<String> {

public MyAdapter(Context context, int resource, int textViewResourceId,
        String[] strings ,  OnClickListener callback ) {
    super(context, resource, textViewResourceId, strings);
    this.callback = callback;
}

そして、getViewメソッドで、行ビューを膨らませた後、クリックリスナーを設定する次の行を追加するだけです。

// Set a click listener on the row itself
row.setOnClickListener ( callback );
// Set the position as tag so it can be retrieved from the click listener because the click listener itself does not provide the position like done in the onItemClickListener
row.setTag ( position );

そして今、MainActivityはOnItemClickListenerの代わりにOnClickListenerを実装する必要があるのでメソッドonItemClickを削除し、 onCreateメソッドから次のステートメントも削除します。

getListView().setOnItemClickListener(this);

そして、次のメソッドを追加します。

@Override
public void onClick ( View view ) {
        // view is the row view returned by getView
        // The position is stored as tag, so it can be retrieved using getTag ()
    CharSequence text = "Item clicked : " + view.getTag () ;
    int duration = Toast.LENGTH_SHORT;
    Toast toast = Toast.makeText(this, text, duration);
    toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL,
            duration, duration);
    toast.show();
}

そして最後に、次の方法でアダプタを宣言します。

    mAdapter = new MyAdapter(this, android.R.layout.simple_list_item_1,
            R.id.titleMainSegments, getResources().getStringArray(
                    R.array.segments_main) , this );

編集

説明 :

あなたに起こったことは、ボタン(など)を含むアイテムを含むListViewがある場合に発生する一般的な問題です。

この場合、ボタンだけのクリックイベントと、アイテムの残りの部分の別のクリックイベント(ユーザーがアイテムをクリックしたがボタンはクリックしなかった場合)が必要な場合は、ここで問題が発生します。 bottonはアイテムのクリック可能属性を消費します。つまり、アイテムにボタンが含まれていない場合、デフォルトでクリック可能になります(ボタンを削除してみることができます)が、アイテムにボタンが含まれている場合は、ボタンがあるためクリック可能になります。それ自体がクリック可能であることを確認します。

したがって、OnItemClickイベントを設定しても、アイテムにボタン(または画像ボタンなどの類似のもの)が含まれている場合は、クリックイベントを消費するため、呼び出されません。

したがって、この場合、OnItemClickイベント(ListViewで直接割り当てられる)を使用することはできません。

解決策は、ListViewにクリックイベントを処理させるのではなく(OnItemClickを使用して)各アイテムにクリックイベントを割り当てることです(上記で説明したように機能しないため)。

OnClickイベントをアイテム(結局のところビュー)に直接割り当てる必要があります。これが、アイテムビューが構築されているアダプタのgetViewメソッドでOnClickリスナーを割り当てた理由です。

これまでのところ、リスナーは1つだけではなく(OnItemClick)、アダプターのgetViewメソッドで割り当てられた、画面に表示されるアイテムと同じ数のリスナーがあります

ユーザーがアイテムビューの任意の場所をクリックすると、クリック可能なビュー(ボタンなど)がある場合を除いて、OnClickリスナーが起動されます。

このようにして問題が解決され、クリックリスナーをボタンに割り当て、クリックリスナーをアイテムビューに割り当てることができます。

ユーザーがアイテムのボタンをクリックすると、ボタンのクリックリスナーが実行されます。ユーザーがアイテムビューの内側をクリックしたがボタンはクリックしなかった場合、クリックリスナーはアイテムビュー自体に設定されているため、アイテムビューのクリックリスナーが実行されます。

小さな問題の1つは、上記のアプローチを使用すると、クリックされたアイテムビューの位置を直接知ることができないことです。これは、OnItemClickリスナーを使用している場合、コールバックによって引数の位置が提供されるためですが、OnClickリスナーでは引数としてクリックされたビューのみがあります。

この小さな問題を解決するために、view.setTag(...)を使用してビュー自体のタグとしてビューの位置を保存し、view.getTag( を使用して以前に保存したものを取得できます。実際には、どのビューにもオブジェクトとして保存されるタグを付けることができるため、ビューを取得するときに、必要なデータ型にキャストして戻します。

このようにして、OnItemClickリスナーを使用しているかのように、ListViewアイテムのクリックイベントの処理とクリックアイテムの位置を知ることができます。

それが役に立てば幸い。

于 2013-01-15T07:38:26.227 に答える