将按钮传递给按钮
我需要将意图传递给Android中的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中的重要事件并调用意图?
还是有更好的方法来实现这一切? (我认为至少我想到的第一种可能性真的很奇怪)。
编辑
并且怎么样让每个项目的“可聚焦” ..这将是更接近铁道部(轨迹球等)。 是否有可能使gridViewItem只在第一次点击(只需焦点)选择,并只点击下一次点击..(这是我试图实现的行为)..
我不知道我正确理解问题,但由于你的用例非常具体,你可能会在你的应用程序中再次需要它,我会做的是创建一个自定义按钮,并在我的布局而不是原生的按钮中使用它。 对于要读取的字符串,我会使用标记属性而不是文本,但它在代码中几乎没有区别。
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就可以了。
我重新思考整个思考和实现,在这种情况下使用GridView是不好的......我再次使用TableLayout并通过XML定义它。然后我可以创建自己的onDoubleClickListener,它将被添加到正确的活动...该GridView我将保存仅用于费用的具体目的,如显示数据库中的项目和响应从服务器,但不是用户界面(标准操作按钮) 是不是更好的解决方案?
看起来不错..我会做得很像这样,但它不能解决我的问题..我将有很多不同的活动使用这个按钮的GridView,所以我问如何解决按钮上的事件绑定特别是gridviews?这些绑定显然是在Activity中完成的,所以我需要通过Adapter到Button来处理它。所以我问是否有办法如何用自定义操作(在Activity中)重写onclick方法,根据onclick处理程序的超级调用(在Button中)运行哪个代码(如果是第二次点击则为no,如果是第一次则为no) – simekadam
在这种情况下,再次抱歉,如果我误解了你的意思,我想你可能会在getView方法中执行它,而在你的适配器中重写。 所以基本上,当你返回按钮或包含按钮的视图(如果你想要更多的细节,请将代码发布到你的getView中),你将调用setIntent,并且自定义按钮将处理其余部分。 – gianpi
所以实际上我需要不同的适配器为每个特定的活动? – simekadam