1

我已经建立了一个Preference包含字段Button的自定义。android:widgetLayout我想在按下此按钮时触发特定操作,但我无法让侦听器接收点击事件。这是我尝试过的:

    @Override
    public void onCreate( Bundle savedInstanceState ) {

        super.onCreate( savedInstanceState );
        addPreferencesFromResource( R.xml.preference_account );

        Preference signOutPreference = findPreference( "sign_out" );
        signOutPreference.setOnPreferenceClickListener( new OnPreferenceClickListener() {

            @Override
            public boolean onPreferenceClick( Preference preference ) {

                Log.i( TAG, "Click" );
                return false;
            }
        } );
    }

    @Override
    public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {

        View root = super.onCreateView( inflater, container, savedInstanceState );
        root.findViewById( R.id.preference_signOut_Button ).setOnClickListener( new OnSignOutClickListener() );

        return root;
    }

    private class OnSignOutClickListener implements OnClickListener {

        @Override
        public void onClick( View v ) {

            Log.i( TAG, "Click" );
        }
    }

OnPreferenceClickListener我单击按钮或首选项行时永远不会触发,并且在尝试查找按钮视图时onCreateView实现会抛出一个。NullPointerException

单击此按钮时如何收听?作为参考,以下是相关的 XML 文件:

偏好帐户.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <Preference
        android:key="sign_out"
        android:persistent="false"
        android:summary="account@email.com"
        android:title="Signed in as:"
        android:widgetLayout="@layout/sign_out_button" />

</PreferenceScreen>

签出按钮.xml

<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/preference_signOut_Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Sign Out" />

编辑:我找到了使用android:onClick按钮字段的解决方案,但如果可能的话,我仍然希望使用解决方案Preference

4

2 回答 2

0

也许你可以试试下面的例子:

class MyOnPreferenceClickListener implements OnPreferenceClickListener {
private Activity activity;
private static final String TAG = "ABCDEFGH...";

public MyOnPreferenceClickListener(Activity activity) {
    this.activity = activity;
}

@Override
public boolean onPreferenceClick(Preference preference) {
    Log.i(TAG, "Click on Item " + preference.getKey());
    return true;
}
}
于 2012-07-18T14:28:32.277 回答
0

稍微更新@Sushanth Raghuthaman 的回答。这对我有用:

public class CustomPreference extends Preference implements OnPreferenceClickListener {

    public CustomPreference(Context context) {
        super(context);
        setOnPreferenceClickListener(this);
    }

    public CustomPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOnPreferenceClickListener(this);
    }

    public CustomPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setOnPreferenceClickListener(this);
    }

    public boolean onPreferenceClick(Preference preference) {
        //Do something here...
        return true;
    }

}

上面重要的一行是使用自身注册首选项点击setOnPreferenceClickListener(this); .

于 2013-03-07T15:05:22.170 回答