OnClickListener 未在 Fragment 内部触发

OnClickListener not triggered inside Fragment

我有自定义 class (ActionBar.class),其中我使用 OnClickListener (OnBackButtonClickListener) 实现自定义 ActionBar 组件。当我在片段中调用此方法时,它不会被触发。

这是我的习惯 class:

public class ActionBar extends LinearLayout {

  private boolean showBackButton;
  private boolean showXButton;
  private boolean showHeader;
  private String header = "";
  private OnClickListener onBackButtonClickListener;
  private OnClickListener onXButtonClickListener;

  @Bind(R.id.back) ImageView backButton;
  @Bind(R.id.header) AutoResizeTextView headerText;
  @Bind(R.id.x_btn) ImageView xButton;

  public ActionBar(Context context) {
    super(context);
    initialize(context, null);
  }

  public ActionBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialize(context, attrs);
  }

  public ActionBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initialize(context, attrs);
  }

  public ActionBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    initialize(context, attrs);
  }


  private void initialize(Context context, AttributeSet attributeSet) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.action_bar_layout, this);
    ButterKnife.bind(this, view);

    if(attributeSet != null) {
      TypedArray typedArray =
          context.getTheme().obtainStyledAttributes(attributeSet, R.styleable.ActionBar, 0, 0);

      try {
        setHeader(typedArray.getString(R.styleable.ActionBar_header) == null ?
            "" : typedArray.getString(R.styleable.ActionBar_header));
        setShowBackButton(typedArray.getBoolean(R.styleable.ActionBar_show_back_button, false));
        setShowXButton(typedArray.getBoolean(R.styleable.ActionBar_show_x_button, false));
        setShowHeader(typedArray.getBoolean(R.styleable.ActionBar_show_header, false));
      } finally {
        typedArray.recycle();
      }
    }
  }

  public boolean isShowBackButton() {
    return showBackButton;
  }

  public void setShowBackButton(boolean showBackButton) {
    this.showBackButton = showBackButton;
    invalidate();
    requestLayout();
  }

  public boolean isShowXButton() {
    return showXButton;
  }

  public void setShowXButton(boolean showXButton) {
    this.showXButton = showXButton;
    invalidate();
    requestLayout();
  }

  public boolean isShowHeader() {
    return showHeader;
  }

  public void setShowHeader(boolean showHeader) {
    this.showHeader = showHeader;
    invalidate();
    requestLayout();
  }

  public String getHeader() {
    return header;
  }

  public void setHeader(String header) {
    this.header = header;
    invalidate();
    requestLayout();
  }

  public OnClickListener getOnBackButtonClickListener() {
    return onBackButtonClickListener;
  }

  public void setOnBackButtonClickListener(OnClickListener onBackButtonClickListener) {
    this.onBackButtonClickListener = onBackButtonClickListener;
  }

  public OnClickListener getOnXButtonClickListener() {
    return onXButtonClickListener;
  }

  public void setOnXButtonClickListener(OnClickListener onXButtonClickListener) {
    this.onXButtonClickListener = onXButtonClickListener;
  }

  @Override protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    backButton.setVisibility(showBackButton ? VISIBLE : INVISIBLE);
    xButton.setVisibility(showXButton ? VISIBLE : INVISIBLE);
    headerText.setVisibility(showHeader ? VISIBLE : INVISIBLE);
    headerText.setText(header);
  }

  @OnClick(R.id.x_btn) void onXButtonClick(View v) {
    if(getOnBackButtonClickListener() != null) {
      getOnBackButtonClickListener().onClick(v);
    }
  }

  @OnClick(R.id.back) void onBackButtonClick(View v) {
    if(getOnXButtonClickListener() != null) {
      getOnXButtonClickListener().onClick(v);
    }
  }
}

这是我的 Fragment 和方法 setOnBackButtonClickListener 调用:

public class ForgotPasswordFragment extends BasePagerFragment
        implements ForgotPasswordView, TextView.OnEditorActionListener, ActionBar.OnClickListener{

 @Bind(R.id.action_bar) ActionBar actionBar;


 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);


 actionBar.setOnBackButtonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            navigateTo(LoginActivity.class);

        }
    });



}
Use @Onclick(R.id.action_bar) void  methodNAme()
{
//ToDo
}

你有

@OnClick(R.id.x_btn) void onXButtonClick(View v) {
    if(getOnBackButtonClickListener() != null) {
      getOnBackButtonClickListener().onClick(v);
    }
  }

  @OnClick(R.id.back) void onBackButtonClick(View v) {
    if(getOnXButtonClickListener() != null) {
      getOnXButtonClickListener().onClick(v);
    }
  }

但看起来应该是:

@OnClick(R.id.back) void onXButtonClick(View v) {
    if(getOnBackButtonClickListener() != null) {
      getOnBackButtonClickListener().onClick(v);
    }
  }

  @OnClick(R.id.x_btn) void onBackButtonClick(View v) {
    if(getOnXButtonClickListener() != null) {
      getOnXButtonClickListener().onClick(v);
    }
  }