【问题标题】:Preference Activity偏好活动
【发布时间】:2017-10-08 22:22:23
【问题描述】:

我正在为我的 android 应用程序创建一个设置活动,它是允许密码与否的选项之一,我不只是希望无论如何检查该选项,所以我希望它在更改首选项之前询问密码。我希望在首选项更改之前弹出一个对话框片段并询问密码,更改后,应调用 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 没有被初始化。

【问题讨论】:

    标签: android android-preferences preferenceactivity preferencefragment


    【解决方案1】:

    因为您只面临getFragmentManager() 的错误。

    尝试将您的代码从 getFragmentManager() 更改为 getSupportFragmentManager() 代替。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

      由于您已经使用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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-22
        • 1970-01-01
        • 1970-01-01
        • 2013-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多