由于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.