将动作传递给按钮

时间:2011-11-30 07:45:50

标签: java android onclick android-intent

我需要将Android中的Intent传递给onClickListener,但方式与正常情况略有不同。

我有按钮的gridView,每按一次按钮,它只会说明按钮所做的动作(它适用于盲人),我需要Intent启动,直到用户同时点击同一按钮两次。 我有这个适配器

public class BlindAdapter extends BaseAdapter implements OnClickListener{
    private Context mContext;
    private String[] labels;
    private Button currentlyClicked;

    public BlindAdapter(Context c, String[] labels) {/*Empty*/}

    @Override
    public int getCount() {/*Empty*/}

    @Override
    public Object getItem(int arg0) {/*Empty*/}

    @Override
    public long getItemId(int arg0) {/*Empty*/}

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {/*Empty*/}

    private void say(String text) {/*Empty*/}

    @Override
    public void onClick(View view) {
        Button btn = (Button) view;
        Log.v("id", ""+view.hashCode());
        if(this.currentlyClicked == null || this.currentlyClicked.hashCode() != view.hashCode()){
            if(this.currentlyClicked != null) this.currentlyClicked.setBackgroundColor(Color.LTGRAY);
            this.currentlyClicked = (Button) view;

            btn.setBackgroundColor(Color.GRAY);
            this.say(btn.getText().toString());
        } else{
            this.say("Zvolena volba:" + btn.getText().toString());
            btn.setBackgroundColor(Color.LTGRAY);
            this.currentlyClicked = null;
        }
    }

    //Notice I posted inly onCLick method with its body for simplicity..

我像那样实例化

gridview.setAdapter(
    new BlindAdapter(this.getApplicationContext(),
    new String[]{"jedna", "dva", "tri", "ctyri", "pet", "šest", "osm"})
);

字符串是对用户来说是红色的动作。所以我需要为每个特定的按钮传递意图。是否可以将其作为另一个参数传递给它?

或者有可能以某种方式覆盖我的Activity中的按钮onclick事件,并且首先调用应用程序决定其第一次或第二次点击的super.OnClick,并根据返回我将停止整个onclick事件,或者继续回到Activity中的重写事件并调用Intent?

还是有更好的方法来实现这一切吗? (我认为至少我想到的第一种可能性真的很奇怪。)

修改

然后让每个项目“可聚焦”......这将是很容易获得的(轨迹球等)。 可以使gridViewItem仅在第一次单击时选择(只需要获得焦点),并且仅在下一次单击时单击...(这是我试图实现的行为)..

2 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了这个问题,但是因为你的用例非常具体,你可能会在你的应用中再次需要它,我要做的是创建一个自定义按钮并在我的布局中使用它而不是原生的。 对于要读取的字符串,我将使用标记属性而不是文本,但它在代码中几乎没有区别。

public class BlindButton extends Button {
    private boolean firstTime = true;
    private Intent intent;

    [...]

    public BlindButton(Context context, AttributeSet attrs) {
        [...]
        setOnClickListener(new OnClickListener() {
            @Override
            public void onClick() {
                if (firstTime) {
                    firstTime = false;
                    say(getText());    // or getTag()
                } else {
                    if (intent != null) {
                        getContext().startActivity(intent);
                    }
                }
            }
        });
    }

    private void setIntent(Intent intent) {
        this.intent = intent;
    }
    private void say(String text) {
        [...]
    }
}

对于意图,我认为这取决于你想要触发什么样的动作。我认为上面的setIntent可以工作,虽然我不太喜欢它,但没有更多的信息我想不出更优雅的解决方案。 基本上在适配器中使用BlindButton时,您不必编写任何其他代码(例如setOnClickListener或其他任何代码),而只需在它们上调用setIntent。

答案 1 :(得分:0)

我重新思考整个思考并意识到,在这种情况下使用GridView很糟糕。我使用TableLayout并通过XML定义它再次使用..然后我可以创建自己的onDoubleClickListener,它将在Activity中添加... GridView我只会出于特定目的而保存,比如显示来自数据库的项目,以及来自服务器的响应,但根本不是用于UI(对于标准操作按钮) 这不是更好的解决方案吗?