如何使用 onPreferenceClick 从静态 PreferenceFragment 调用方法
How to call a method from static PreferenceFragment using onPreferenceClick
我正在使用 Android 工作室设置模板(在 AppCompatPreferenceActivity 中使用静态 PreferenceFragment)。我正在尝试收听首选项单击以调用打开文件选择器的方法。
我收到一条错误消息:
无法从静态上下文中引用非静态方法 pickImage(int)”。
我不确定如何正确地做到这一点。我是否应该将所有调用的方法更改为 Static?
代码的相关部分:
public class SettingsActivity extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupActionBar();
setTheme(R.style.PreferencesStyle);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new GeneralPreferenceFragment())
.commit();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
setHasOptionsMenu(true);
Preference correctAnswerPickImagePref = findPreference(Constants.CORRECT_ANSWER_PICK_IMAGE_PREF);
correctAnswerPickImagePref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
pickImage(Constants.PICK_CORRECT_ANSWER_IMAGE_REQUEST);
return true;
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
startActivity(new Intent(getActivity(), SettingsActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
}
private void pickImage(int requestCode) {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed; request the permission
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
requestCode);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
} else {
// Permission has already been granted
startPickImageActivity(requestCode);
}
}
}
解决方案一:
将 private void pickImage(int)
方法移动到 GeneralPreferenceFragment
,然后修复由上下文引起的错误。
方案二:
将 private void pickImage(int)
方法设为静态,并为其添加一个 Context 参数,然后修复由上下文引起的错误。
我认为您的代码存在以下问题:
- 你的activity可以正常延长
AppCompatActivity
- 你的
GeneralPreferenceFragment
不应该是static
pickImage
里面比较好GeneralPreferenceFragment
我正在使用 Android 工作室设置模板(在 AppCompatPreferenceActivity 中使用静态 PreferenceFragment)。我正在尝试收听首选项单击以调用打开文件选择器的方法。 我收到一条错误消息:
无法从静态上下文中引用非静态方法 pickImage(int)”。 我不确定如何正确地做到这一点。我是否应该将所有调用的方法更改为 Static?
代码的相关部分:
public class SettingsActivity extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupActionBar();
setTheme(R.style.PreferencesStyle);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new GeneralPreferenceFragment())
.commit();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
setHasOptionsMenu(true);
Preference correctAnswerPickImagePref = findPreference(Constants.CORRECT_ANSWER_PICK_IMAGE_PREF);
correctAnswerPickImagePref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
pickImage(Constants.PICK_CORRECT_ANSWER_IMAGE_REQUEST);
return true;
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
startActivity(new Intent(getActivity(), SettingsActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
}
private void pickImage(int requestCode) {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed; request the permission
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
requestCode);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
} else {
// Permission has already been granted
startPickImageActivity(requestCode);
}
}
}
解决方案一:
将 private void pickImage(int)
方法移动到 GeneralPreferenceFragment
,然后修复由上下文引起的错误。
方案二:
将 private void pickImage(int)
方法设为静态,并为其添加一个 Context 参数,然后修复由上下文引起的错误。
我认为您的代码存在以下问题:
- 你的activity可以正常延长
AppCompatActivity
- 你的
GeneralPreferenceFragment
不应该是static
pickImage
里面比较好GeneralPreferenceFragment