卓派观点

由于jwisp本人在使用手机过程中, 经常需要打开或者关闭横竖屏的开关. (比如jwisp在发短信或者各种文本编辑情况时, 经常需要全键盘来快速输入, 而浏览文本或者某些应用时, 躺着或者坐着不切换横竖屏)

好, 有了jwisp这个需求, 我们如何实现呢.

这里说两句废话, 有同学一碰到问题先网上搜, 其实有时候搜东西, 信息不是没有, 而是太多, 花很久时间才能找到自己想要的结果. 如果花很久又没有找到自己的结果就更郁闷了. 而且这种方法常常也没有让自己锻炼到自己的技术. 当然搜索能力得到了提高, 呵呵.
所以不如我们直接找到android源代码, 看看google是怎么实现的, 即可以锻炼自己阅读源码能力, 也提高了分析能力, 还能在自己的程序中借鉴google的程序设计思想, 岂不是一举三得之妙事?

好, 进入正题, 首先我们在手机界面上, 可以找到这个程序设置的关键词. 设置 -> 显示设置 -> 自动旋转屏幕

如果熟悉android源码, 直接定位DisplaySettings.java (packages/apps/settings/src/com/android/settings/下)

如果不知道这个类, 我们该如何找到呢?

在命令行下, 敲命令也行:

grep '自动旋转屏幕' /android -r -s

打开DisplaySettings.java后, 关注下面这几个关键地方就行

1. DisplaySettings类继承关系

public class DisplaySettings extends PreferenceActivity

我们在设置类的layout中, 经常使用PreferenceActivity类

2.checbox资源

    private CheckBoxPreference mAccelerometer;
 ......
    protected void onCreate(Bundle savedInstanceState) {
 ......

        addPreferencesFromResource(R.xml.display_settings);

 ......
        mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER);
        mAccelerometer.setPersistent(false);

 ......
    }

mAccelerometer是这个横竖屏切换的关键点, 它的状态动作决定了横竖屏开关的打开和关闭. 它是在display_settings.xml中设置的.

2.加载checkbox的初始状态

    private void updateState(boolean force) {
 ......
        updateAnimationsSummary(mAnimations.getValue());
        mAccelerometer.setChecked(Settings.System.getInt(
                getContentResolver(),
                Settings.System.ACCELEROMETER_ROTATION, 0) != 0);
    }

  加载checkbox的初始状态

3.mAccelerometer的状态更新

    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        if (preference == mAccelerometer) {
            Settings.System.putInt(getContentResolver(),
                    Settings.System.ACCELEROMETER_ROTATION,
                    mAccelerometer.isChecked() ? 1 : 0);
        }
        return true;
    }

ok, 这里就是关键点了. Settings使用SharedPreference方式设置了开关的对应值, 我们这里只需要通过Settings.System的静态方法putInt就可以实现键值对对应的修改选项呢了

很简单, 如果自己分析的话, 应该也很快, 不会比网上找更慢

最后, jwisp提醒大家, 在程序中添加Settings.System.putInt()后, 还需要在AndroidManifest.xml中添加对应权限:

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

ok, good luck.

版权所有,转载请注明出处。
转载自 <a href="http://www.jwisp.com/?p=95" title="源码DisplaySettings分析android横竖屏切换的开关" rel="bookmark">源码DisplaySettings分析android横竖屏切换的开关 | 卓派</a>

我简单说几句


随机推荐

最新评论

固定链接

随机链接