我正在为我的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 未初始化。
答案 0 :(得分:0)
希望这会有所帮助。由于您只是面临
getFragmentManager()
的错误。尝试将代码从
getFragmentManager()
更改为 而是getSupportFragmentManager()
。
答案 1 :(得分:0)
您正在混合支持而非支持类。当您导入类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;
}
}