如何在.java代码中启用禁用的(xml)ListPreference对象?
编辑3 以下是我如何在主如何在.java代码中启用禁用的(xml)ListPreference对象?,java,android,xml,listpreference,Java,Android,Xml,Listpreference,编辑3 以下是我如何在主活动的onCreate中确定设备是否为平板电脑的方法: public static boolean isTablet(Context ctx){ return (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK ) >= Configuration.SCREENLAYOUT_SI
活动的onCreate
中确定设备是否为平板电脑的方法:
public static boolean isTablet(Context ctx){
return (ctx.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK
)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
我不知道这是否是一种黑客行为,也不可靠,但无论如何,我都不知道如何在片段
(以下)中的onCreate
中使用它,因为我不知道传递给的上下文
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);Preference p = getPreferenceManager().findPreference("orientation");
p.setEnabled(isTablet(????????????????));
编辑按要求显示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>
我无法制作Android Studio 1.1.0,让我给它一个id
;但如果有办法的话,我的解决方案就是——我该怎么做
编辑
解决方法:
android:enabled=“true”
非常蹩脚。请帮忙 看起来您可以使用PreferenceManager并根据键获取首选项。
请参阅文档和
您可以使用该方法确定它是否是平板电脑
然后,它就像获得偏好一样简单,如果是平板电脑就启用它
编辑:
为了使用您的方法并为其提供有效的上下文
,您可以这样做。请注意,我使用了为isTablet()
方法发布的代码的修改版本:
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;
}
}
//...................
多亏了丹尼尔·纽金特令人难以置信的慷慨,以下是最终奏效的方法
preferences.xml
(不启用或禁用方向):
isTablet.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());
}
}
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;
}
}
你能发布你的@array/index
和@array/modes
吗?我感觉我做错了……你想只为平板电脑启用此首选项吗?你使用的是这里描述的方法吗@DanielNugent——没有,但是哪种方法?(长链接)如果设备没有足够大的“横向高度”(即宽度)来显示我的整个UI,我想要的是不允许旋转,这对于典型的手机来说是正确的。我使用找到的第一个isaplate
方法。我在Barnes and Noble,与聊天室的连接刚刚断开。@DSlomer64我刚刚更新了答案,这应该可以用。我使用了一个有人发布的变体,以使isTablet()
方法更具可读性和可理解性。我根据这个答案修改了代码:我最后的聊天评论是,void
对于onCreateView
来说不是有效的返回类型。而在类中,也会导致错误。你在用安卓工作室吗?1.1.0?如果我将返回类型更改为查看
,则AS会抱怨受保护
,并将其更改为公共
。我觉得很好,但它能带来什么回报呢?不为空
;非viewGroup
(这导致非法状态异常:Fragment com.dslomer64.kakurocombosbuildvariants.settings片段未创建视图
)。
<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>
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());
}
}
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;
}
}