LoginSignup
2
1

More than 5 years have passed since last update.

CustomPreferenceにおける「OnBindViewListener」の作り方

Last updated at Posted at 2015-08-11

CustomPreference系は onBindView()以前にレイアウトが内包するWidget(ButtonやEditText)を操作しようとするとNullPointerExceptionで落ちるので注意。

作成ポイント

以下のポイントをおさえておけばとりあえずOK。
(カスタムビュー自体の実装方法は省略)

  • CustomPreference内に通知用Listenerのpublic interfaceを作成(ここではOnBindViewListener
  • CallBackメソッドを追加(ここではonBind()
  • PreferenceActivity/FragmentにCallBackListenerをimplement
  • CallBackメソッド内でWidgetを操作

カスタムビューをattrs.xmlに登録

カスタムビューの作成をしたら、attr.xmlへの登録を行うこと。

attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- CustomButtonPreference -->
    <declare-styleable name="CustomButtonPreference">
        <attr name="android:title" />
        <attr name="android:key" />
    </declare-styleable>
</resources>

(コード例)CustomButtonPreference

Button1つのCustomPreferenceのコード例。
CustomButtonPreferenceにCustomButtonPreference.OnClickListener()も追加したもの。
内部的にはView.OnClickListener()を介している。

CustomButtonPreference.java
public class CustomButtonPreference extends Preference implements View.OnClickListener {

    private Button mButton;
    private OnBindViewListener mBindViewListener;
    private OnClickListener mClickListener;

    //-------------------------
    // コンストラクタ、View生成など
    //-------------------------

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);

        // 「onBindView内」 でfindViewByIdを呼ぶことが大切
        mButton = (Button) view.findViewById(R.id.button);

        // onBindView終了を通知する
        // 同時にView.OnClickListenerをセット
        if (mBindViewListener != null) {
            mBindViewListener.onBind();
            mButton.setOnClickListener(this);
        }
    }

    // OnBindViewListenerのセッター(PreferenceFragment内で呼ぶ)
    public void setOnBindViewListener(OnBindViewListener listener) {
        mBindViewListener = listener;
    }

    // OnClickListenerのセッター(PreferenceFragment内で呼ぶ)
    public void setOnClickListener(OnClickListener listener) {
        mClickListener = listener;
    }

    // 内部的にはView.OnClickListenerを介してCustomClickListenerで通知する
    @Override
    public void onClick(View v) {
        if (mClickListener != null) {
            mClickListener.onClick();
        }
    }

    /**
     * 本PreferenceのBindView終了を通知するリスナー
     */
    public interface OnBindViewListener {
        // CallBackメソッド
        void onBind();
    }

    /**
     * 本Preferenceのボタン専用クリックリスナー
     */
    public interface OnClickListener {
        // CallBackメソッド
        void onClick();
    }
}
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1