2

私はかなり長い間これに苦労してきましたが、この問題は何千回も解決されたと確信しています. SOや他の場所で他のさまざまな同様の質問を見てきましたが、これを解決できませんでした。

中心的な問題は次のとおりです。

リスト項目にクリック可能なコンポーネントがある場合、(コンテキスト アクション バーを表示するために) 行を長押しすると、その行のセレクターが表示されません。ただし、長いクリックはトリガーされます。長いクリックが発生しているという視覚的なフィードバックはありません。

この問題は、行レイアウトにクリック可能なアイテムが含まれている場合にのみ発生することに注意してください。これは、私がすでに試したことの簡単なチェックリストです。

  • 「ListView」で、私はに設定drawSelectorOnTopしましたtrue(これをXMLと両方で試しましたgetListView()
  • 「ListView」で、私はに設定choiceModeしましたsingleChoice(これをXMLと両方で試しましたgetListView()
  • 「ListView」で、listSelector透明、白などのさまざまな値に設定しました(XMLと.xmlの両方でこれを試しましたgetListView().
  • もちろん、LinearLayoutリスト内の個々の行をホストする は にlongClickable設定されていtrueます。これがないと、長いクリックも登録されません。

私が何をしても、リスト項目を長押ししてもセレクターは表示されませんが、長押しは発生し、OnItemLongClickコールバックを受け取ります。

これを引き起こしている可能性のあるものについての手がかりはありますか?


問題を再現するコード:

list_item.xml

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

<TextView
    android:id="@+id/tvTitle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<Button
    android:id="@+id/btnGo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:background="@android:drawable/btn_star_big_on" />

</LinearLayout>

activity_main.xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/configurations" >
</ListView>

</LinearLayout>

MainActivity.java

public class MainActivity extends ListActivity {

private ListView mListView;
private Context mContext;
private RowAdapter mAdapter;
private static final String LOG_TAG = "ListViewLongClick";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mContext = this;
    mListView = getListView();
    mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    mListView.setSelector(android.R.color.white);
    mListView.setDrawSelectorOnTop(true);
    mAdapter = new RowAdapter(mContext, R.layout.list_item, R.id.tvTitle,
            getResources().getStringArray(R.array.configurations));
    mListView.setAdapter(mAdapter);
    mListView.setOnItemLongClickListener(new OnItemLongClickListener() {

        public boolean onItemLongClick(AdapterView<?> parent, View view,
                int position, long id) {

            Toast.makeText(mContext, "Long-click on item " + position,
                    Toast.LENGTH_SHORT).show();
            return true;
        }
    });
}

static class RowAdapter extends ArrayAdapter<String> {

    private int mResource;
    private String[] configs;

    public RowAdapter(Context context, int resource,
            int textViewResourceId, String[] objects) {
        super(context, resource, textViewResourceId, objects);
        this.mResource = resource;
        this.configs = objects;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View viewToReturn = convertView;
        if (convertView == null) {
            viewToReturn = LayoutInflater.from(getContext()).inflate(
                    this.mResource, null, false);
        }

        TextView label = (TextView) viewToReturn.findViewById(R.id.tvTitle);
        label.setText(configs[position]);
        Button btn = (Button) viewToReturn.findViewById(R.id.btnGo);
        btn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                Log.d(LOG_TAG, "Aha! You clicked on the star button");
            }
        });
        return viewToReturn;
    }

}

}

文字列.xml

<resources>

<string name="app_name">ListViewLongClick</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>

 <string-array name="configurations">
    <item >Phone-Port</item>
    <item >Phone-Land</item>
    <item >Tab7-Port</item>
    <item >Tab7-Land</item>
    <item >Tab10-Port</item>
    <item >Tab10-Land</item>
</string-array>
</resources>
4

2 に答える 2

4

次のように list_items を変更する必要があります。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:baselineAligned="true"
              android:longClickable="true"
              android:orientation="horizontal"
              android:background="@android:drawable/list_selector_background"
        >

    <TextView
            android:id="@+id/tvTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
            android:id="@+id/btnGo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:background="@android:drawable/btn_star_big_on" />

</LinearLayout>

android:background="@android:drawable/list_selector_background"私はあなたに追加しましたLinearLayout

これがお役に立てば幸いです=)

于 2012-07-12T11:29:50.460 に答える
0

res / menuフォルダーにContextMenuを作成し、onCreateContextMenuメソッドをオーバーライドします。

 @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    menu.setHeaderTitle("Please select:");
    inflater.inflate(R.menu.context_menu, menu);
}

onContextItemSelectedメソッドをオーバーライドします。また、onCreateメソッドに次の行を追加することを忘れないでください。

registerForContextMenu(getListView());

詳細については、次のリンクを参照してください。

于 2012-07-12T11:19:09.220 に答える