覆盖设计支持库行为

时间:2015-11-10 16:42:02

标签: android android-support-library android-snackbar

我在条件满足时尝试解除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文件夹然后我可以修改它但是有没有办法这样做而不是这个?

1 个答案:

答案 0 :(得分: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;
      });