如何在 .java 代码中启用禁用的(在 xml 中)ListPreference 对象?
How do I enable a disabled (in xml) ListPreference object in .java code?
编辑 3
以下是我在 onCreate
中确定设备是否为平板电脑的方法 for main Activity
:
public static boolean isTablet(Context ctx){
return (ctx.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK
)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
我不知道这是否是 hack 和不可靠的,但无论如何,我不知道如何在 Fragment
(下)中的 onCreate
中使用它,因为我不知道 Context
传递给 isATablet
.
什么
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);Preference p = getPreferenceManager().findPreference("orientation");
p.setEnabled(isTablet(????????????????));
EDIT 按要求显示 strings.xml
中定义的数组:
<string-array name="modes">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
<string-array name="indices">
<item>Portrait</item>
<item>Landscape</item>
<item>Rotate</item>
</string-array>
* 结束编辑 *
如何在 .java
代码中 enable
这个 ListPreference
对象?
<PreferenceCategory>
<ListPreference
android:key="orientation"
android:title="Orientation (for tablets only)"
android:enabled="false"
android:summary="Lock in portrait or landscape mode or neither (allow rotation to determine)?"
android:defaultValue="0"
android:entries="@array/indices"
android:entryValues="@array/modes"
>
</ListPreference>
</PreferenceCategory>
我不会AndroidStudio 1.1.0让我给它一个id
;但如果有办法,那就是我的解决方案——我该怎么做?
编辑
解决方法:
android:enabled="true"
if(isATablet) { // ***************************
switch (preferences.getString(ORIENTATION, "0")) {
case "0":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case "1":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case "2":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
break;
default:
Toast.makeText(getApplicationContext(), "Bad orientation", Toast.LENGTH_SHORT).show();
}
}
else{ // ***************************
editor = preferences.edit(); // ***************************
editor.putString(ORIENTATION,"0"); // ***************************
editor.commit(); // ***************************
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
非常蹩脚。请帮忙!
看来您可以只使用 PreferenceManager 并根据 key
获取 Preference。
请参阅文档 here and here。
您可以使用 described here 方法来确定它是否是平板电脑。
然后,只要获得首选项,如果是平板电脑就启用它就很简单了!
编辑:
为了使用您的方法并给它一个有效的 Context
,您可以这样做。请注意,我为 isTablet()
方法使用了发布 here 代码的修改版本:
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
Preference p = getPreferenceManager().findPreference("orientation");
p.setEnabled(isTablet(getActivity()));
}
private boolean isTablet(Context context) {
int screenLayout = context.getResources().getConfiguration().screenLayout;
screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;
switch (screenLayout) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
return false;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
return false;
case Configuration.SCREENLAYOUT_SIZE_LARGE:
return true;
case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9
return true;
default:
return false;
}
}
//...................
多亏了 Daniel Nugent 的慷慨解囊,这才终于奏效了。
preferences.xml
(不启用或禁用方向):
<PreferenceCategory>
<ListPreference
android:key="orientation"
android:title="Orientation (for tablets only)"
android:summary="Lock in portrait or landscape mode or neither (allow rotation to determine)?"
android:defaultValue="0"
android:entries="@array/indices"
android:entryValues="@array/modes"
>
</ListPreference>
</PreferenceCategory>
</PreferenceScreen>
SettingsFragment.java
:
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// next two lines ****************************************************
Preference p = getPreferenceManager().findPreference("orientation");
p.setEnabled(isTablet(getActivity()));
// Let java code enable or disable orientation ***********************
}
@Override
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
}
}
isTablet.java
:
private boolean isTablet(Context context) {
int screenLayout = context.getResources().getConfiguration().screenLayout;
screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;
switch (screenLayout) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
return false;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
return false;
case Configuration.SCREENLAYOUT_SIZE_LARGE:
return true;
case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9
return true;
default:
return false;
}
}
编辑 3
以下是我在 onCreate
中确定设备是否为平板电脑的方法 for main Activity
:
public static boolean isTablet(Context ctx){
return (ctx.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK
)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
我不知道这是否是 hack 和不可靠的,但无论如何,我不知道如何在 Fragment
(下)中的 onCreate
中使用它,因为我不知道 Context
传递给 isATablet
.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);Preference p = getPreferenceManager().findPreference("orientation");
p.setEnabled(isTablet(????????????????));
EDIT 按要求显示 strings.xml
中定义的数组:
<string-array name="modes">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
<string-array name="indices">
<item>Portrait</item>
<item>Landscape</item>
<item>Rotate</item>
</string-array>
* 结束编辑 *
如何在 .java
代码中 enable
这个 ListPreference
对象?
<PreferenceCategory>
<ListPreference
android:key="orientation"
android:title="Orientation (for tablets only)"
android:enabled="false"
android:summary="Lock in portrait or landscape mode or neither (allow rotation to determine)?"
android:defaultValue="0"
android:entries="@array/indices"
android:entryValues="@array/modes"
>
</ListPreference>
</PreferenceCategory>
我不会AndroidStudio 1.1.0让我给它一个id
;但如果有办法,那就是我的解决方案——我该怎么做?
编辑
解决方法:
android:enabled="true"
if(isATablet) { // ***************************
switch (preferences.getString(ORIENTATION, "0")) {
case "0":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case "1":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case "2":
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
break;
default:
Toast.makeText(getApplicationContext(), "Bad orientation", Toast.LENGTH_SHORT).show();
}
}
else{ // ***************************
editor = preferences.edit(); // ***************************
editor.putString(ORIENTATION,"0"); // ***************************
editor.commit(); // ***************************
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
非常蹩脚。请帮忙!
看来您可以只使用 PreferenceManager 并根据 key
获取 Preference。
请参阅文档 here and here。
您可以使用 described here 方法来确定它是否是平板电脑。
然后,只要获得首选项,如果是平板电脑就启用它就很简单了!
编辑:
为了使用您的方法并给它一个有效的 Context
,您可以这样做。请注意,我为 isTablet()
方法使用了发布 here 代码的修改版本:
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
Preference p = getPreferenceManager().findPreference("orientation");
p.setEnabled(isTablet(getActivity()));
}
private boolean isTablet(Context context) {
int screenLayout = context.getResources().getConfiguration().screenLayout;
screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;
switch (screenLayout) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
return false;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
return false;
case Configuration.SCREENLAYOUT_SIZE_LARGE:
return true;
case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9
return true;
default:
return false;
}
}
//...................
多亏了 Daniel Nugent 的慷慨解囊,这才终于奏效了。
preferences.xml
(不启用或禁用方向):
<PreferenceCategory>
<ListPreference
android:key="orientation"
android:title="Orientation (for tablets only)"
android:summary="Lock in portrait or landscape mode or neither (allow rotation to determine)?"
android:defaultValue="0"
android:entries="@array/indices"
android:entryValues="@array/modes"
>
</ListPreference>
</PreferenceCategory>
</PreferenceScreen>
SettingsFragment.java
:
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// next two lines ****************************************************
Preference p = getPreferenceManager().findPreference("orientation");
p.setEnabled(isTablet(getActivity()));
// Let java code enable or disable orientation ***********************
}
@Override
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
}
}
isTablet.java
:
private boolean isTablet(Context context) {
int screenLayout = context.getResources().getConfiguration().screenLayout;
screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;
switch (screenLayout) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
return false;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
return false;
case Configuration.SCREENLAYOUT_SIZE_LARGE:
return true;
case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9
return true;
default:
return false;
}
}