在API 17/RTL支持发布后,我将以下内容添加到我的清单中
android:supportsRtl="true"
Run Code Online (Sandbox Code Playgroud)
这导致Lint在我的视图中无论我在paddingLeft/Right中的哪个位置都正确地给了我这些警告:
考虑添加android:paddingStart ="8dp"以更好地支持从右到左的布局
考虑添加android:paddingEnd ="8dp"以更好地支持从右到左的布局
我按照这个android-developers博文中的指导做了这个,这暗示我们不需要创建一个新的layout-v17文件,而是可以只使用paddingStart/End以及paddingLeft/Right属性(左/右需要继续支持较低的minSdk).
我刚刚从之前的Beta版本对Android Studio 1.0进行了更新,并注意到一个新的lint错误,该错误指出:
- 此处引用的属性paddingStart可能会导致某些早于API 17的特定设备崩溃(当前最小值为7)
建议的修复方法是:
覆盖layout-v17中的资源
这是有道理的.但是,在创建layout-v17并从主布局文件夹中删除未使用的paddingStart/End后,原来的Lint警告再次出现,说我应该使用paddingStart/End.好像我不明白我已经覆盖了layout-v17中的文件.
有谁知道如何解决看似矛盾的Lint错误/警告消息?我知道我可以tools:ignore发出警告,但我希望有一个"正确"的解决方案.
编辑(1/19/15):我想到了一个安卓问题,导致新的lint错误被添加到Android Studio中.这表明"某些特定设备上的崩溃"是指API16上的一些三星平板电脑,其中paddingStart有自己的定义,并且当它试图解析"8dp"时崩溃.
上面链接中的某些人建议使用layout-ldrtl文件夹来处理rtl方向,而不是使用paddingStart和paddingEnd.
当你发现用户有一个API16平板电脑,然后手动设置你所有视图的属性时,我也在其他地方建议覆盖LayoutInflator的Factory2.这肯定会奏效,但看起来非常"手动".
我很遗憾没有访问其中一个崩溃的设备,所以我无法验证为什么我没有找到任何人在网上建议简单地将paddingStart放在/ layout-v17 /文件夹中,并将paddingLeft放在/ layout /中?尽管paddingStart只存在于layout-v17中,API16三星平板电脑仍会继续崩溃吗?
起初我认为这是我的应用程序的一个问题,但它似乎发生在姜饼模拟器中的任何应用程序(虽然有趣的是,不是主屏幕).
要复制我的问题,打开eclipse并启动用于姜饼的android模拟器(我使用"Google API - API Level 9"作为我的目标)
因此,模拟器加载后复制的过程是
按LCtrl-F11将方向切换到横向,然后再切换到纵向
结果:
在主屏幕中:
视图按预期旋转为横向,然后返回到纵向
在任何应用程序(我已经尝试过浏览器,计算器,地图和我正在处理的应用程序):
视图旋转到横向,然后什么都没有,即使模拟器以横向模式显示手机,它也会保持在横向状态(见下文)

有没有其他人有这个问题,或者我以某种不正确的方式安装了模拟器 - 这对任何以前的模拟器都不是问题
我有一个使用内置缩放控件的webview,如下所示:
wv = new WebView(this);
wv.getSettings().setBuiltInZoomControls(true);
Run Code Online (Sandbox Code Playgroud)
注意:这会激活两个主要功能 - 捏合缩放和invokeZoomPicker()(后者仅在视图上执行滑动操作时调用,简单触摸不启用它)
并且我还希望在触摸事件发生时发生事情,使用以下内容
wv.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Log.i("touch", "touched!");
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
当WebView加载并点击屏幕时,每当我与屏幕交互时,日志都会按预期进行"触摸".但是,如果我做了一些会引发invokeZoomPicker()的事情(捏缩放似乎不会导致这个问题,只要缩放小部件没有出现),onTouchListener就会停止响应我的点击(即使几秒钟后) ,当小部件从视图中消失时).
为了确保它是invokeZoomPicker(),我编辑了我的代码的第二部分,如下所示:
wv.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
wv.invokeZoomPicker();
Log.i("touch", "touched!");
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
这个新的onTouch方法现在只触发一次(因此zoomwidget出现在视图上 - 并在几秒钟后消失),然后在重新加载视图之前不会再次调用onTouch方法 - 所以它肯定是invokeZoomPicker()/ Zoom小部件的问题
我是否错过了一些允许它们共存的重要代码,或者我只需要选择哪一个我可以不用的代码?