【问题标题】:On listview button click, log shows: "ViewPostImeInputStage ACTION_DOWN"单击列表视图按钮时,日志显示:“ViewPostImeInputStage ACTION_DOWN”
【发布时间】:2017-08-10 18:05:57
【问题描述】:

我看到很多人都遇到过这个问题,但是提供给他们的解决方案(例如将布局放入另一个布局中)不起作用。因此我决定上传我自己的代码,希望有人知道它有什么问题。我有一个列表视图,每行有 2 个按钮(subtract_button 和 add_button),使用以下适配器类显示:

public class AdapterSIUsed2 extends CursorAdapter implements View.OnClickListener {

private RowViewHolder rowView = new RowViewHolder();

public static class RowViewHolder {
    public TextView name,used,category,amount;
    public Button subtract,add;
    public int position;
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case (rowView.add.getId()):
            // Do something
            Log.d("Button clicked","add");
            return;
        case (rowView.subtract.getId()):
            Log.d("Button clicked","subtract");
            return;
    }
}

public AdapterSIUsed2(Context context, Cursor cursor) {
    super(context, cursor, 0);
}

@Override
public View newView(Context context, Cursor csr, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
    View listView = inflater.inflate(R.layout.listlayout_shopping_items_used, null);
    rowView.name = (TextView) listView.findViewById(R.id.shopping_items_name);
    rowView.used = (TextView) listView.findViewById(R.id.shopping_items_used);
    rowView.category = (TextView) listView.findViewById(R.id.shopping_items_category);
    rowView.amount = (TextView) listView.findViewById(R.id.shopping_items_amount);
    rowView.subtract = (Button) listView.findViewById(R.id.subtract_button);
    rowView.add = (Button) listView.findViewById(R.id.shopping_items_add_button);
    rowView.position = csr.getPosition();
    rowView.subtract.setOnClickListener(this);
    rowView.add.setOnClickListener(this);
    listView.setTag(rowView);
    rowView.name.setTag(rowView);
    rowView.used.setTag(rowView);
    rowView.category.setTag(rowView);
    rowView.amount.setTag(rowView);
    return listView;
}

@Override
public void bindView(View view, Context context, Cursor csr) {
    TextView name = (TextView) view.findViewById(R.id.shopping_items_name);
    TextView used = (TextView) view.findViewById(R.id.shopping_items_used);
    TextView category = (TextView) view.findViewById(R.id.shopping_items_category);
    TextView amount = (TextView) view.findViewById(R.id.shopping_items_amount);

    name.setText(csr.getString(csr.getColumnIndex(Constants.SHOPPING_ITEMS_COL_1)));
    used.setText(csr.getString(csr.getColumnIndex(Constants.SHOPPING_ITEMS_COL_2)));
    category.setText(csr.getString(csr.getColumnIndex(Constants.SHOPPING_ITEMS_COL_3)));
    amount.setText(csr.getString(csr.getColumnIndex(Constants.SHOPPING_ITEMS_COL_4)));

    Button add = (Button) view.findViewById(R.id.shopping_items_add_button);
    add.setOnClickListener(this);
    Button subtract = (Button) view.findViewById(R.id.subtract_button);
    subtract.setOnClickListener(this);

    int pos = csr.getPosition();
    add.setTag(pos);
    subtract.setTag(pos);
}

奇怪的是,当我单击加法或减法按钮时,在这两种情况下,我的日志都显示以下两行: D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN 我/项目点击::( 当我单击列表项本身时,我的日志仅显示以下行: D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN

有谁知道这里发生了什么以及如何解决它?提前致谢!

【问题讨论】:

    标签: android listview android-studio button logging


    【解决方案1】:

    ACTION_DOWN 只是表示按下了某些东西。它与ACTION_UP 相关,这意味着不再按下某些东西。

    显然,您按下的按钮就是您在bindView 中设置的按钮。尚不清楚为什么单击列表项本身时会出现这种行为;看起来您没有在单元格本身上设置任何onClickListeners,或任何类型的父ViewGroup。您可能需要仔细检查并确保您的布局 ID 是它们应该是的。也有可能将它用作适配器的任何东西都在搞乱。

    您的onClick 方法从接口实现中被覆盖,您似乎得到了正确的行为。即使它为您提供了额外的信息,它也会记录您要求的内容(“item clicked: :(”)。我建议只使用它,并将日志更改为使用 Log.d 代替(Log.d 专门用于调试目的)。你也可以这样做:

        @Override
        public void onClick(View v) {
            if (v.getId() == rowView.add.getId()) {
                //do something;
                return;
            if (v.getId() == rowView.subtract.getId()) {
                //do something;
                return;
            }
        }
    });
    

    然后你就做

    rowView.add.setOnClickListener(this);
    rowView.subtract.setOnClickListener(this);
    

    【讨论】:

    • 首先非常感谢您的回复。我尽力理解您所说的内容,并以几种方式编辑了我的代码,但不幸的是没有成功。问题是我当前的代码。在带有“案例”的行中,它告诉我“需要常量表达式”,你知道如何解决这个问题吗?
    • 对,我忘了。你不能把可能改变的东西放在一个case语句中——它必须是不变的。在这种情况下,只需使用普通的 if 语句。我将编辑我的帖子,以便更清楚地了解它是如何工作的。
    • 非常好,现在给我的是以下内容:按减法按钮; “D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN”和“D/Button clicked:减去”,按添加按钮; “ViewPostImeInputStage ACTION_DOWN”和“D/Button clicked: add”,在listview项目的其他地方按下; “D/ViewRootImpl:ViewPostImeInputStage ACTION_DOWN”。所以它现在确实可以识别按钮。我希望它仍然给出 ACTION_DOWN 的事实并不重要,你知道它是否有?
    • 另外,当我尝试在单击按钮时添加诸如创建吐司之类的操作时,它告诉我无法从非静态上下文中引用非静态方法
    • 你能帮帮我吗? ^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多