回答:
バドル、
あなたandroid:key
はアイテムを設定する必要があります、そしてあなたのコードではあなたがすることができます...
XMLで以下を使用するとします。
<Preference android:title="About" android:key="myKey"></Preference>
次に、コードで次のことを実行できます。
Preference myPref = (Preference) findPreference("myKey");
myPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
//open browser or intent here
return true;
}
});
findPreference
廃止予定です。
PreferenceActivity.findPreference
廃止予定です。ただし、ドキュメントには「この機能は新しいPreferenceFragmentクラスにあるはずです。古いモードでPreferenceActivityを使用している場合、このドキュメントは非推奨のAPIに適用されます」とPreferenceFragment.findPreference
非推奨ではありません(APIの時点で)レベル23、執筆時の電流)。したがって、findPreference
それ自体は非推奨ではありません。直接使用するため、PreferenceActivity
非推奨です。Googleは、私たちPreferenceFragment
が放棄するのではなく、代わりに移動することを望んでいfindPreference
ます。
onPreferenceClick
、true
クリックが処理されたかどうかを返しますfalse
。
ウェブサイトを立ち上げるには:
<PreferenceScreen android:title="website">
<intent
android:action="android.intent.action.VIEW"
android:data="http://www.example.com"
/>
</PreferenceScreen>
特定のアクティビティを起動するには:
<PreferenceScreen android:title="something">
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.example.foo"
android:targetClass="com.example.foo.SomeActivity"
/>
</PreferenceScreen>
「android:mimetype」を使用してMIMEタイプを設定することもできます。
intent-filter
のマニフェストで何かを指定する必要がありますSomeActivity
、cuz am getting ActivityNotFoundException
:(
onPreferenceTreeClickイベントを使用する必要があります。
たとえば、http://www.javased.com/index.php?source_dir = platform_packages_apps_phone / src / com / android / phone / MobileNetworkSettings.javaを参照してください。
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
/** TODO: Refactor and get rid of the if's using subclasses */
if (mGsmUmtsOptions != null &&
mGsmUmtsOptions.preferenceTreeClick(preference) == true) {
return true;
} else if (mCdmaOptions != null &&
mCdmaOptions.preferenceTreeClick(preference) == true) {
if (Boolean.parseBoolean(
SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
mClickedPreference = preference;
// In ECM mode launch ECM app dialog
startActivityForResult(
new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
REQUEST_CODE_EXIT_ECM);
}
return true;
} else if (preference == mButtonPreferredNetworkMode) {
//displays the value taken from the Settings.System
int settingsNetworkMode = android.provider.Settings.Secure.getInt(mPhone.getContext().
getContentResolver(), android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
preferredNetworkMode);
mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
return true;
} else if (preference == mButtonDataRoam) {
if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
//normally called on the toggle click
if (mButtonDataRoam.isChecked()) {
// First confirm with a warning dialog about charges
mOkClicked = false;
new AlertDialog.Builder(this).setMessage(
getResources().getString(R.string.roaming_warning))
.setTitle(android.R.string.dialog_alert_title)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setPositiveButton(android.R.string.yes, this)
.setNegativeButton(android.R.string.no, this)
.show()
.setOnDismissListener(this);
} else {
mPhone.setDataRoamingEnabled(false);
}
return true;
} else if (preference == mButtonDataEnabled) {
if (DBG) log("onPreferenceTreeClick: preference == mButtonDataEnabled.");
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setMobileDataEnabled(mButtonDataEnabled.isChecked());
return true;
} else if (preference == mLteDataServicePref) {
String tmpl = android.provider.Settings.Secure.getString(getContentResolver(),
android.provider.Settings.Secure.SETUP_PREPAID_DATA_SERVICE_URL);
if (!TextUtils.isEmpty(tmpl)) {
TelephonyManager tm = (TelephonyManager) getSystemService(
Context.TELEPHONY_SERVICE);
String imsi = tm.getSubscriberId();
if (imsi == null) {
imsi = "";
}
final String url = TextUtils.isEmpty(tmpl) ? null
: TextUtils.expandTemplate(tmpl, imsi).toString();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
} else {
android.util.Log.e(LOG_TAG, "Missing SETUP_PREPAID_DATA_SERVICE_URL");
}
return true;
} else {
// if the button is anything but the simple toggle preference,
// we'll need to disable all preferences to reject all click
// events until the sub-activity's UI comes up.
preferenceScreen.setEnabled(false);
// Let the intents be launched by the Preference manager
return false;
}
}
2018+ UPDATE
今日、findPreference
メソッドは廃止されました。したがって、これを実現するにonPreferenceTreeClick
は、Preferenceフラグメントのメソッドをオーバーライドするだけです。例えば:
public class MySettingsFragment extends PreferenceFragment {
@Override
public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen,
Preference preference)
{
String key = preference.getKey();
if(key.equals("someKey")){
// do your work
return true;
}
return false;
}
}
さらに、特定の設定要素(などListPreference
)内のクリックを処理する必要がある場合はsetOnPreferenceChangeListener
、のonCreate
メソッド内に登録する必要がありMySettingsFragment
ます。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
// register listener
final Preference prefList = findPreference("key");
prefList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object value) {
System.out.println("Selected: " + value);
return true;
}
});
}
onPreferenceClick
とはonPreferenceTreeClick
?
@jason gilbertの回答のフォローアップ
私はtargetSdkVersion 25を使用していますが、彼の答えはうまくいきませんでした。Ptentタグでインテントタグをラップする必要がありました。例:
<PreferenceScreen android:title="something">
<Preference title="Title">
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.example.foo"
android:targetClass="com.example.foo.SomeActivity"
/>
</Preference>
</PreferenceScreen>
onPostCreate
、それが早すぎるため機能しません(Nullpointer-Exception)。助けて