2011-11-30 132 views
1

我需要将意图传递给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只在第一次点击(只需焦点)选择,并只点击下一次点击..(这​​是我试图实现的行为)..

回答

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就可以了。

+0

看起来不错..我会做得很像这样,但它不能解决我的问题..我将有很多不同的活动使用这个按钮的GridView,所以我问如何解决按钮上的事件绑定特别是gridviews?这些绑定显然是在Activity中完成的,所以我需要通过Adapter到Button来处理它。所以我问是否有办法如何用自定义操作(在Activity中)重写onclick方法,根据onclick处理程序的超级调用(在Button中)运行哪个代码(如果是第二次点击则为no,如果是第一次则为no) – simekadam

+1

在这种情况下,再次抱歉,如果我误解了你的意思,我想你可能会在getView方法中执行它,而在你的适配器中重写。 所以基本上,当你返回按钮或包含按钮的视图(如果你想要更多的细节,请将代码发布到你的getView中),你将调用setIntent,并且自定义按钮将处理其余部分。 – gianpi

+0

所以实际上我需要不同的适配器为每个特定的活动? – simekadam

0

我重新思考整个思考和实现,在这种情况下使用GridView是不好的......我再次使用TableLayout并通过XML定义它。然后我可以创建自己的onDoubleClickListener,它将被添加到正确的活动...该GridView我将保存仅用于费用的具体目的,如显示数据库中的项目和响应从服务器,但不是用户界面(标准操作按钮) 是不是更好的解决方案?