2011-10-25 15 views
0

私はCheckBoxPreferenceの簡単な拡張を作成して、タイトルの左側にイメージアイコンを持つ独自のカスタムビューを持つことができました。コードは以下の通りです:setOnPreferenceChangeListenerがカスタムcheckboxpreferenceで機能していない

public class CustomCheckBoxPreference extends CheckBoxPreference { 

private Drawable icon; 

public CustomCheckBoxPreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.CustomCheckBoxPreference, 0, 0); 
    icon = arr.getDrawable(R.styleable.CustomCheckBoxPreference_icon); 
    setLayoutResource(R.layout.custom_checkbox_pref); 
} 

@Override 
protected void onBindView(View view) { 
    super.onBindView(view); 
    ImageView prefsIcon = (ImageView) view.findViewById(R.id.prefs_icon); 
    prefsIcon.setImageDrawable(icon); 
} 

問題は、何らかの理由で、私はどのCustomCheckboxPreferenceに設定OnPreferenceChangeListenerは効果がありませんし、保存されていないということです。私はいくつかのアンドロイドメソッドをオーバーライドして、superを呼び出し、次に何が呼び出されるかを見るためにラインを印刷する実装を試みました。特にcallChangeListenerは呼び出されません。 onPreferenceChangedのコールバックにつながるのはこのメソッドです。私はちょうど何が起こるか見るためにsetCheckedのonPreferenceChanged内部への呼び出しに投げてみましたとOnPreferenceChangeListenerがnullである:私は少し混乱しています

 mTwitterPref.setChecked(!mTwitter.needsAuth()); 
    mTwitterPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      System.out.println("Twitter Preference Changed!"); 
      if ((Boolean) newValue) { 
       if (mTwitter.needsAuth()) { 
        System.out.println("We Need To Login To Twitter!"); 
        IntentUtils.startActivityForResult(ProfileAccountsActivity.this, 
          TwLoginActivity.class, ACTIVITY_OAUTH); 
       } 
      } else { 
       showDialog(DIALOG_LOGOUT_TWITTER); 
      } 
      return false; 
     } 
    }); 

  getOnPreferenceChangeListener().onPreferenceChange(this, checked); 

これは私がpreferencechangelistenerを設定する方法ですなぜ私はonBindViewとコンストラクタを上書きするだけなので、preferencechangelistenerが正常に動作しないのですか?私は両方のスーパーを呼び出します。何かご意見は?

+0

このチェックボックスをオンにすると、環境設定が更新されますか?チェックボックスにonCheckChangedListenerを設定する必要はありませんか? – LuxuryMode

答えて

4

セットアンドロイド:フォーカス可能= "false" にし、アンドロイド:チェックボックスをクリック可能= "false" を:

<CheckBox 
    android:id="@+android:id/checkbox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:focusable="false" 
    android:clickable="false" /> 
このスレッドに

さらに詳しい情報:私はカスタムボタンと同じ問題があったClickable rows on custom ArrayAdapter

0

。私は@ jeanhによって提供されたソリューションを試してみました。しかし、私のボタンは押されておらず、周囲の領域だけが強調表示されていました。さらに、ボタンがいくつかあればどうでしょうか?明らかに、このソリューションは動作しません。だから、私は深く掘ることにしましたし、私の解決策は、以下だった:

のxml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/widget_frame" android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:paddingLeft="15dp" 
android:paddingTop="5dp" 
android:paddingRight="10dp" 
android:paddingBottom="5dp"  
> 
<!-- define my button --> 
<Button android:id="@android:id/title" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="17sp" 
     android:typeface="sans" 
     android:textStyle="bold" 
     android:textColor="#000000" 
></Button>  

</RelativeLayout> 

Javaクラス:ITを使用する方法

public class ButtonPreference extends Preference { 

    private final String TAG = getClass().getName(); 

    public interface ButtonListener {  
     public void onCustomClick(); 
    } 

    public ButtonListener buttonListener; 

    public void setButtonListener(ButtonListener buttonListener){ 
     this.buttonListener = buttonListener; 
    } 

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

    public ButtonPreference(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle);   
    } 

    @Override 
    protected View onCreateView(ViewGroup parent){ 

     RelativeLayout layout = null; 

     try { 
      LayoutInflater mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      layout = (RelativeLayout)mInflater.inflate(R.layout.button_preference, parent, false); 
      //FIND OUR BUTTON IN LAYOUT 
      Button button = (Button) layout.findViewById(android.R.id.title); 
      if(button!=null){ 
      Log.e(TAG, "button found"); 
      button.setOnClickListener(new OnClickListener() {     
       @Override 
       public void onClick(View v) {      
        if(buttonListener!=null){       
         buttonListener.onCustomClick(); //INVOKE OUR EVENT! 
        } 
       } 
      }); 
      }    
     } 
     catch(Exception e) 
     { 
      Log.e(TAG, "Error creating info preference", e); 
     }   
     return layout;   
    }  
} 

?シンプル!

public class WallpaperSettings extends PreferenceActivity { 

protected void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.prefs);  

    ButtonPreference defaultSettingsButton = (ButtonPreference) findPreference(EngineCore.pref+"defaultSettings");  
    defaultSettingsButton.setButtonListener(new ButtonListener() {   
     @Override 
     public void onCustomClick() { 
      Gdx.app.log("ButtonListener", "onCustomClick");    
     } 
    }); 
} 
} 

私はそれが他人を助けることを望みます。

0

解決策が見つかりました! PreferenceFragmentで、onPreferenceChangeが働いたことはないので、私の場合は は、私は、私も混乱し、私のカスタムダイアログクラスに

public class SvDialogPreference extends DialogPreference 

をDialogPreferenceを拡張します。

SvDialogPreference pref= (SvDialogPreference) findPreference("mainKey"); 
if(pref != null) { 
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
@Override 
public boolean onPreferenceChange(Preference preference, Object newValue) { 
// Never execute ! 
}} 

これを解決するにはonDialogClosedで "super.callChangeListener"を呼び出しました。

public class SvDialogPreference extends DialogPreference{ 
.... 
@Override 
protected void onDialogClosed(boolean positiveResult) { 

double InputValue = Double.parseDouble(KEY.getText().toString()); 
    super.callChangeListener(InputValue); 
    super.onDialogClosed(positiveResult); 
} 

今、onPreferenceChangeは正常に機能しました。

関連する問題