如何在 .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;
    }
  }