2015-11-10 22 views
0

当条件满足时,我试图解雇Snackbar覆盖设计支持库行为

snackbar.setAction("Retry", new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(isConnected(getApplicationContext())){ 
        toggleButtonsState(true); 
        snackbar.dismiss(); 
       } else { 
        snackbar.show(); 
       } 
      } 
     }); 
     snackbar.show(); 

但是,Snackbar实现会在单击操作时自动解除它。

public Snackbar setAction(CharSequence text, final OnClickListener listener) { 
    TextView tv = this.mView.getActionView(); 
    if(!TextUtils.isEmpty(text) && listener != null) { 
     tv.setVisibility(0); 
     tv.setText(text); 
     tv.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 
       listener.onClick(view); 
       Snackbar.this.dismiss(); 
      } 
     }); 
    } else { 
     tv.setVisibility(8); 
     tv.setOnClickListener((OnClickListener)null); 
    } 

    return this; 
} 

一般来说,有没有修改的Gradle编译库,以便与我的需要应付的方法。即。删除此行Snackbar.this.dismiss();。我知道我可以搜索源代码,并将其放入libs文件夹中,然后我可以修改它,但有没有办法做到这一点?

回答

0

不幸的是,你不能因为Snackbar类是最终的,不能重写方法,所以它的行为。

您可以尝试的是将View.OnTouchListener设置为Snackbar视图,并防止它仅针对操作视图获取任何触摸事件。我不确定snackBar.getView()是否会返回包含操作视图在内的整个快餐栏。

snackBar.getView().setOnTouchListener(new View.OnTouchListener(){ 
    @Override 
    public boolean onTouch (View v, MotionEvent event){ 
     if(v instanceof Button) { 
      //This is the Action view event, do your logic. 
      if(isConnected(getApplicationContext())){ 
        toggleButtonsState(true); 
       return false; 
       } 
      return true; 
     } 
     //not action view, proceed normally 
     return false; 
     });