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