偏好活动

时间:2017-10-08 22:22:24

标签: android android-preferences preferenceactivity preferencefragment

我正在为我的Android应用程序创建一个设置活动,它是允许密码的选项之一,我不只是想要检查该选项,所以我希望它在更改首选项之前要求输入密码。我希望在首选项更改之前弹出一个Dialog片段并询问密码,更改后,应调用 onPreferenceChange 方法,如果密码正确,则可以通过返回 true来更改首选项

问题是我的设置片段无法识别 getFragmentManager(),即使我执行 getActivity.getFragmentManager ,也会出现 preferencefragment错误无法转换为对话框 。该对话框适用于项目中的正常活动,但不适用于首选项片段。

这是对话片段,显示活动的投放位置

public class password_dialog extends DialogFragment {
public interface PasswordDialogListener {
    void onDialogPositiveClick(DialogFragment dialog, String password);

    void onDialogNegativeClick(DialogFragment dialog);
}

PasswordDialogListener mListener;


@Override
public void onAttach(Context activity) {
    super.onAttach(activity);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the PasswordDialogListener so we can send events to the host
        mListener = (PasswordDialogListener) activity;
    } catch (Exception e) {
      Log.e("dialog",e.getMessage());
    }
}

。 。

这是类扩展的首选项片段的主要代码扩展 PreferenceFragmentCompat 实现Preference.OnPreferenceChangeListener,password_dialog.PasswordDialogListener

 @Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    addPreferencesFromResource(R.xml.preferences);
    Preference preference = findPreference(getString(R.string.printSetting));

    /*****Realm*****/
    Realm.init(getActivity());
    realm = Realm.getDefaultInstance();

    preference.setOnPreferenceChangeListener(this);
}

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    DialogFragment PasswordDialogFragment = new password_dialog();
    PasswordDialogFragment.show(getFragmentManager(), "Password");

    if (passwordIsCorrect) {
        return true;
    } else {
        return false;
    }

}

因此,它会产生空指针异常,因为 mListener 未初始化。

2 个答案:

答案 0 :(得分:0)

  

由于您只是面临getFragmentManager()的错误。

     

尝试将代码从getFragmentManager()更改为   而是getSupportFragmentManager()

希望这会有所帮助。

答案 1 :(得分:0)

您正在混合支持而非支持类。当您导入类IDE时,建议您导入两个具有相同名称的类之一:

enter image description here

由于您已经使用PreferenceFragmentCompat(来自支持库的类),您应该使用支持片段相关的类:

import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat;

public class PreferenceFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceChangeListener {

    @Override public boolean onPreferenceChange(Preference preference, Object o) {
        FragmentManager fragmentManager = getFragmentManager();
        DialogFragment PasswordDialogFragment = get();
        PasswordDialogFragment.show(fragmentManager, "Password");
        return true;
    }
}