[android] 목록의 버튼을 사용하여 Listactivity에서 onListItemClick을 실행하는 방법은 무엇입니까?

사용자 지정 ListAdapter를 사용하여 목록에서보기를 생성하는 간단한 ListActivity가 있습니다. 일반적으로 ListAdapter는 뷰를 TextViews로 채울 것이지만 이제는 버튼도 여기에 넣고 싶습니다.

그러나 목록 항목에 포커스 가능한 뷰를두면 목록 항목을 클릭 할 때 ListActivity에서 onListItemClick ()이 실행되는 것을 방지하는 것은 내 이해와 경험입니다. 버튼은 여전히 ​​목록 항목 내에서 정상적으로 작동하지만 버튼 이외의 항목을 누르면 onListItemClick이 트리거되기를 원합니다.

이 작업을 어떻게 할 수 있습니까?



답변

이전 주석 솔루션 에서 썼 듯이 ImageButton에서 setFocusable (false)입니다.

목록 요소의 android:descendantFocusability="blocksDescendants" 루트 레이아웃 에 추가하려는 더 우아한 솔루션이 있습니다 . 그러면 ListItem에 대한 클릭이 가능하고 별도로 Button 또는 ImageButton 클릭을 처리 할 수 ​​있습니다.

도움이되기를 바랍니다;)

건배


답변

여기서 도와 드릴 수 있기를 바랍니다. listView 항목에 대한 사용자 지정 레이아웃이 있다고 가정하고이 레이아웃은 버튼과 TextView, ImageView 등과 같은 다른보기로 구성됩니다. 이제 버튼 클릭시 다른 이벤트가 발생하고 클릭 된 다른 모든 이벤트에서 다른 이벤트가 발생하기를 원합니다.

ListActivity의 onListItemClick ()을 사용하지 않고도이를 달성 할 수 있습니다.
수행해야 할 작업은 다음과 같습니다.

사용자 지정 레이아웃을 사용하고 있으므로 사용자 지정 어댑터에서 getView () 메서드를 재정의하고있을 수 있습니다. 트릭은 버튼에 대해 다른 리스너를 설정하고 전체 뷰 (행)에 대해 다르게 설정하는 것입니다. 예를 살펴보십시오.

private class MyAdapter extends ArrayAdapter<String> implements OnClickListener {

    public MyAdapter(Context context, int resource, int textViewResourceId,
            List<String> objects) {
        super(context, resource, textViewResourceId, objects);
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String text = getItem(position);
        if (null == convertView) {
            convertView = mInflater.inflate(R.layout.custom_row, null);
        }
        //take the Button and set listener. It will be invoked when you click the button.
        Button btn = (Button) convertView.findViewById(R.id.button);
        btn.setOnClickListener(this);
        //set the text... not important     
        TextView tv = (TextView) convertView.findViewById(R.id.text);
        tv.setText(text);
        //!!! and this is the most important part: you are settin listener for the whole row
        convertView.setOnClickListener(new OnItemClickListener(position));
        return convertView;
    }

    @Override
    public void onClick(View v) {
        Log.v(TAG, "Row button clicked");
    }
}

OnItemClickListener 클래스는 다음과 같이 선언 할 수 있습니다.

private class OnItemClickListener implements OnClickListener{
    private int mPosition;
    OnItemClickListener(int position){
        mPosition = position;
    }
    @Override
    public void onClick(View arg0) {
        Log.v(TAG, "onItemClick at position" + mPosition);
    }
}

물론 OnItemClickListener 생성자에 더 많은 매개 변수를 추가 할 것입니다.
그리고 한 가지 중요한 것은 위에 표시된 getView의 구현이 매우 추악합니다. 일반적으로 findViewById 호출을 피하기 위해 ViewHolder 패턴을 사용해야하지만 이미 알고있을 것입니다.
내 custom_row.xml 파일은 ID “button”의 Button, ID “text”의 TextView 및 ID “image”의 ImageView가있는 RelativeLayout입니다.
문안 인사!


답변

사용자 지정 ListView에 포커스 가능한 요소가 포함되어 있으면 onListItemClick이 작동하지 않습니다 (예상되는 동작이라고 생각합니다). 사용자 정의보기에서 초점을 제거하면 트릭이 수행됩니다.

예를 들면 :

public class ExtendedCheckBoxListView extends LinearLayout {

    private TextView mText;
    private CheckBox mCheckBox;

    public ExtendedCheckBoxListView(Context context, ExtendedCheckBox aCheckBoxifiedText) {
         super(context);
         …
         mText.setFocusable(false);
         mText.setFocusableInTouchMode(false);

         mCheckBox.setFocusable(false);
         mCheckBox.setFocusableInTouchMode(false);
        …
    }
}


답변

나는 같은 문제가 있습니다 : OnListItemClick not fired! [해결됨]
ListActivity를 확장하는 클래스에서 발생
합니다. TextBox 및 ListView를 포함하는 ListActivity의 레이아웃이 LinearLayout에 중첩되고
행에 대한 다른 레이아웃 (LineraLayout에 중첩 된 CheckBox 및 TextBox)이 있습니다.

그게 코드입니다.

res / layout / configpage.xml (ListActivity의 기본)

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TextView
        android:id="@+id/selection"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="pippo" />
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="false"
        android:background="#aaFFaa" >
    </ListView>
<LinearLayout>

res/layout/row.xml (layout for single row)
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content">
  <CheckBox
      android:id="@+id/img"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      **android:focusable="false"**
      **android:focusableInTouchMode="false"** />

  <TextView
      android:id="@+id/testo"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      **android:focusable="false"**
      **android:focusableInTouchMode="false"** />
</LinearLayout>

src /…/…/ ConfigPage.java

public class ConfigPage extends ListActivity
{
    TextView selection;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.configpage);
        // loaded from res/value/strings  
        String[] azioni = getResources().getStringArray(R.array.ACTIONS);
        setListAdapter(new ArrayAdapter&lt;String&gt;(this, R.layout.row,
                R.id.testo,   azioni));
        selection = (TextView) findViewById(R.id.selection);
    }

    public void onListItemClick(ListView parent, View view, int position, long id)
    {
        selection.setText(" " + position);
    }
}

row.xml에 추가하면 작동하기 시작합니다.

  • android:focusable="false"
  • android:focusableInTouchMode="false"

Eclipse 3.5.2
Android SDK 10.0.1
min SDK 버전을 사용합니다. 3

나는 이것이 도움이되기를 바랍니다
… 그리고 내 영어에 대해 죄송합니다 🙁


답변

android:focusable="false"버튼의 속성 중 하나로 추가 하세요.


답변

ToggleButton에서 동일한 문제가 발생했습니다. 반나절 동안 벽에 머리를 부딪친 후 마침내 문제를 해결했습니다. ‘android : focusable’을 사용하여 포커스 가능한 뷰를 포커스 불가능하게 만드는 것만 큼 간단합니다. 또한 목록 행의 초점 및 클릭 가능성 (단어를 구성했습니다)을 사용하지 말고 기본값으로 두십시오.

물론 이제 목록 행의 포커스 가능한 뷰가 포커스를받을 수 없으므로 키보드를 사용하는 사용자는 포커스를 맞추는 데 문제가있을 수 있습니다. 문제가되지 않을 것 같지만 100 % 완벽한 앱을 작성하려는 경우 onItemSelected 이벤트를 사용하여 선택한 행의 요소에 초점을 맞추고 이전에 선택한 행의 요소에 초점을 맞출 수 없게 만들 수 있습니다.


답변

 ListView lv = getListView();
lv.setTextFilterEnabled(true);

lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
    int position, long id) {
  // When clicked, show a toast with the TextView text
  Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
      Toast.LENGTH_SHORT).show();
}
});