覆盖设计支持库行为

Override design support library behaviour

我正在尝试在满足条件时关闭 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库来满足我的需要。 IE。删除此行 Snackbar.this.dismiss();。我知道我可以搜索源代码并将其放入 libs 文件夹中,然后我可以对其进行修改,但是有没有其他方法可以做到这一点?

不幸的是,你不能,因为 Snackbar class 是最终的并且不能覆盖方法,所以它是行为。

您可以尝试将 View.OnTouchListener 设置为 Snackbar 视图并防止它只为操作视图获取任何触摸事件。我不确定 snackBar.getView() returns 整个小吃店是否包括动作视图。

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;
      });