繁体   English   中英

如何在.java代码中启用禁用的(在xml中)ListPreference对象?

[英]How do I enable a disabled (in xml) ListPreference object in .java code?

编辑3

这是我在onCreate确定设备是否为平板电脑的主要Activity

  public static boolean isTablet(Context ctx){
    return (ctx.getResources().getConfiguration().screenLayout
        & Configuration.SCREENLAYOUT_SIZE_MASK
    )
        >= Configuration.SCREENLAYOUT_SIZE_LARGE;
  }

我不知道这是否是一种破解并且不可靠,但是无论如何,我都不知道如何在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(????????????????));

编辑显示按要求在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代码中enableListPreference对象?

<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>

我不能让Android Studio 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);

}

很la脚 请帮忙!

看来您可以只使用PreferenceManager并基于key获得Preference。 在此处此处查看文档。

您可以使用此处描述的方法来确定它是否是平板电脑。

然后,就像获得首选项一样简单,如果是平板电脑则启用它!

编辑:

为了使用您的方法并为其提供有效的Context ,您可以这样做。 请注意,我对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;
            }
        }
        //...................

感谢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;
    }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM