TextView始终存在RTL(从右到左)语言的问题.由于我只知道如何阅读希伯来语(除了英语),我将讨论它的问题:
文本对齐(我不是在谈论引力).作为一种RTL语言,希伯来语从右到左放置单词(与英语相反).
为了展示它是多么令人讨厌,想象一下,而不是展示"Hello world".你通常得到".Hello world".如果你只用一个句子就可以很容易地解决这个问题,但是当有多个标点字符时会更难.
元音位置.希伯来语不需要元音来阅读文本,但有时没有它们就很难阅读(特别是圣经).对于元音,希伯来语有所谓的"NIKUD",它实际上就像字母内部的点.Android中的问题是它们通常位于错误的位置.
为了展示它是多么令人讨厌,想象一下,而不是展示"Hello world".你通常得到".eHlol owrld".即使你试图修复它(把元音总是放在当前元素之后的一个字符),字母中的位置也不正确(想象"Hello"中的"e"就像"H"之上的那样,例子).
仅在版本4.2(在此处阅读,在"原生RTL支持"下),谷歌已经修复了所有希伯来语相关问题(或者至少看起来如此).
希伯来语的问题导致每个以色列航空公司和每个定制ROM制造商都有自己的解决方案来解决不同的问题,这使得在4.2之前的设备上处理RTL文本几乎是不可能的.
如果文本包括希伯来语和英文字母,事情会变得更加令人沮丧.
我已经阅读了很多关于这些问题的网站,我尝试了很多解决方案,没有一个解决了所有设备上的问题:
有人建议将字符'\ u200F'(或'\ u202D')放在文本的结尾/开始/两个位置.
有人建议使用Html.fromHtml()方法并在那里添加一些特殊内容.
有些人甚至建议使用WebView(也许使用WebSettings.setDefaultTextEncodingName()).
这个问题有一个明确的解决方案吗?
我认为最好的事情是因为Android 4.2解决了这个问题,并且Android是开源的,我们应该将其TextView导入到我们可以使用的库中,但谷歌还没有提供这样的库.
假设您创建的应用程序具有与您通过"滚动活动"向导创建的应用程序类似的UI,但您希望滚动标记具有捕捉功能,如下所示:
<android.support.design.widget.CollapsingToolbarLayout ... app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" >
Run Code Online (Sandbox Code Playgroud)
事实证明,在许多情况下,它存在捕捉问题.有时UI不会捕捉到顶部/底部,使得CollapsingToolbarLayout保持在两者之间.
有时它也会尝试捕捉到一个方向,然后决定捕捉到另一个方向.
您可以在此处查看所附视频的两个问题.
我认为这是我在RecyclerView上使用setNestedScrollingEnabled(false)时遇到的问题之一,所以我在这里问了一下,但后来我注意到即使使用解决方案也没有使用此命令,甚至在使用时一个简单的NestedScrollView(由向导创建),我仍然可以注意到这种行为.
这就是为什么我决定这个报告是一个问题,在这里.
可悲的是,我找不到StackOverflow上那些奇怪错误的解决方法.
为什么会发生,更重要的是:如何在仍然使用它应该具有的行为的同时避免这些问题?
编辑:这是一个很好的改进Kotlin版本的接受答案:
class RecyclerViewEx @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : RecyclerView(context, attrs, defStyle) {
private var mAppBarTracking: AppBarTracking? = null
private var mView: View? = null
private var mTopPos: Int = 0
private var mLayoutManager: LinearLayoutManager? = null
interface AppBarTracking {
fun isAppBarIdle(): Boolean
fun isAppBarExpanded(): Boolean
}
override fun dispatchNestedPreScroll(dx: …Run Code Online (Sandbox Code Playgroud) 注意:事实证明,原始问题在其假设中是不正确的.在底部查看有关其编辑的更多详细信息.
它现在关于电池节电器,而不是电池节电和打盹模式.它也不是关于Service&BroadcastReceiver,而是仅仅是BroadcastReceiver.
从Android Lollipop开始,Google推出了新的,手动和自动的方式来帮助节省电池:
"打盹"模式和"电池节电器".
在某些情况下,由于这些技术,应用程序可能无法访问Internet.
我在一个应用程序上工作,该应用程序需要使用在特定情况下触发的后台服务来访问Internet,如果收到重要内容,则会显示一些UI.
作为用户,我注意到在某些情况下,它无法访问Internet.
检查应用程序是否可以访问Internet是这样的:
public static boolean isInternetOn(Context context) {
final NetworkInfo info = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
return !(info == null || !info.isConnectedOrConnecting());
}
Run Code Online (Sandbox Code Playgroud)
问题是我需要检查为什么这有时会返回false,所以如果它失败了,我们应该告诉用户(可能通过通知)无法访问数据,因为设备限制了应用程序,并提供给用户从电池优化中列出应用程序.
我不确定哪些影响这个:打盹,节电或两者兼而有之,如果总是这样,对于所有设备,在所有情况下.
我找到的是如何查询打盹模式和省电模式(省电模式):
public class PowerSaverHelper {
public enum PowerSaveState {
ON, OFF, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
}
public enum WhiteListedInBatteryOptimizations {
WHITE_LISTED, NOT_WHITE_LISTED, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
}
public enum DozeState {
NORMAL_INTERACTIVE, DOZE_TURNED_ON_IDLE, NORMAL_NON_INTERACTIVE, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
}
@NonNull
public static DozeState getDozeState(@NonNull Context context) {
if (VERSION.SDK_INT < VERSION_CODES.M)
return DozeState.IRRELEVANT_OLD_ANDROID_API; …Run Code Online (Sandbox Code Playgroud) 我最近开始使用NDK开发一些代码,我想到了使用NDK开发时可能出现的可移植性问题.
由于NDK使用本机代码,因此需要根据CPU架构进行编译.这是一个问题,因为无论设备具有什么CPU,用户都需要运行应用程序.
我注意到我可以修改文件"jni/Application.mk"并使用:
APP_ABI:= armeabi armeabi-v7a x86
但是,我不知道从这一步开始我应该做些什么.该应用程序是否包含每个CPU架构的所有已编译代码,并在运行时自动选择正确的代码?
另外,如果有另一个未知的CPU架构怎么办?
如果我尝试在Google TV上运行该应用会发生什么,根据我记得的内容根本不支持NDK?
我发现的另一个解决方案是多apk支持.但是,我不确定我理解它.这一切是否意味着您每次使用不同的配置创建相同的APK?ADT没有专门的自动化工具来帮助解决这个问题吗?
经过这么多小时的空闲时间后,我准备将我的第一个应用程序发布到游戏商店,但遗憾的是我在上传已签名的应用程序时遇到了困难.
我已经使用我创建的密钥库(所有这些都通过Eclipse和ADT)成功导出了应用程序,因此我将已签名的APK上传到Play商店(此处).
我一直收到这条消息:
上传失败您的APK无法使用'aapt dump Badging'进行分析.错误输出:无法运行aapt转储标记:W/ResourceType(14856):获取资源号为0x01080049的值时没有已知包错误获取'android:icon'属性:属性不是字符串值
因此:

应用程序本身在真实设备上运行良好,正在使用的图像文件是android-assets-studio网站使用的普通PNG文件.
我在这里搜索了StackOverflow并发现了很多关于它的帖子(这里).我读了很多,并尝试了下一步,但没有任何帮助:
将应用程序图标放在不同的文件夹("drawable","drawable-mdpi",...甚至"drawable-xxxhdpi")中,具有多种组合(从每个文件夹中放入/删除).
在"应用程序"标记和启动器活动标记上设置标签,图标和主题.
更改图像文件名和文件本身(将其替换为默认的应用程序图标).
清理项目.
检查Lint消息.
更新ADT(至22.3.0.v201310242005-887826),Eclipse(至Kepler Service Release 1),SDK工具(至22.3),SDK构建工具(至19.0.1).一切都是最新的官方版本.
检查是否没有使用双jar文件(多个库上不存在jar文件,特别是如果它有不同的版本).
尝试将strings.xml放入"res/values-en"而不是"res/values"
尝试将"android:value"属性添加到清单上的所有元数据标记(由Google建议).它没用.事实上,在我读过的所有教程中,我从来没有从AppWidget看到过这样的要求,所以我认为不需要它.
尝试了aapt命令:
aapt dump badging
Run Code Online (Sandbox Code Playgroud)这向我展示了游戏商店显示的相同内容(我已经用XXX替换了真正的包名和应用名称):
Run Code Online (Sandbox Code Playgroud)application: label='XXX XXX' icon='res/drawable-mdpi/app_icon.png' launchable-activity: name='XXX.XXX.XXXActivity' label='XXX XXX' icon='res/drawable-mdpi/app_icon.png' W/ResourceType( 9132): No known package when getting value for resource number 0 x01080049 ERROR getting 'android:icon' attribute: attribute is not a string value
即使文件存在于此文件夹中,也会发生这种情况.
这是清单.再次,用XXX替换了活动和应用程序的真实路径和名称.我可以向你保证路径是正确的,因为应用程序可以正常运行.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="XXX.XXX"
android:installLocation="auto"
android:versionCode="2"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" …Run Code Online (Sandbox Code Playgroud) 我有一个在顶部有一些视图的布局,它应该可以与它们下面的EditText一起滚动.
EditText占用了剩余的空间,占用了所需的空间.
这是一个演示它的示例POC布局(此处仅使用了2个EditTexts):
<android.support.v4.widget.NestedScrollView android:id="@+id/nestedScrollView"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent" android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical">
<EditText
android:id="@+id/titleEditText" android:layout_width="match_parent" android:layout_height="wrap_content"
android:ellipsize="end" android:hint="title" android:imeOptions="actionNext|flagNoExtractUi"
android:inputType="text|textAutoCorrect|textCapSentences" android:maxLines="1"
android:nextFocusDown="@id/contentEditText" android:nextFocusForward="@id/contentEditText"
android:scrollHorizontally="true" android:textColor="#2a2f3b" android:textColorHint="#a3a3a3"
android:textSize="21sp"/>
<EditText
android:id="@+id/contentEditText" android:layout_width="match_parent" android:layout_height="match_parent"
android:gravity="top" android:hint="content" android:background="@android:drawable/alert_light_frame"
android:imeOptions="actionDone|flagNoEnterAction|flagNoExtractUi" android:textSize="18sp"
android:inputType="textMultiLine|textAutoCorrect|textCapSentences"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
Run Code Online (Sandbox Code Playgroud)
我已经设置了一个背景框架,可以直观地显示EditText的大小.
我已经找到了很多我写的解决方案,但是没有一个能够很好地处理滚动.
我一直看到的,至少是其中一个问题:
我尝试过这些解决方案:
windowSoftInputMode在清单中尝试了各种值,并尝试isNestedScrollingEnabled在NestedScrollView中进行设置.如何让底部的EditText占用尽可能多的空间,并且仍然可以滚动整个NestedScrollView,而不会出现编辑问题?
编辑:因为原来的应用程序有点复杂,底部有一些视图(在工具栏内部)当你没有专注于底部的EditText时自动隐藏,这就得到了我找不到的答案上班.
此外,我不小心将赏金给予错误的答案,所以这是一个新的赏金,在更复杂的POC上.问题保持不变.NestedScrollView应该保持在同一个地方,而不是在关注底部EditText时滚动.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:orientation="vertical">
<View
android:layout_width="0dp" android:layout_height="0dp" android:focusable="true" …Run Code Online (Sandbox Code Playgroud) 我希望为Android Lollipop及更高版本的listView项添加一个简单的涟漪效果.
首先,我想将它设置为简单的行,然后设置为9个补丁行甚至是CardView.
我确信这个会很容易,因为它甚至不需要我定义普通选择器.即使对于简单的行,我也没有这样做.出于某种原因,涟漪效应超出了行的边界:

不仅如此,在某些情况下,物品的背景会卡在我设定的颜色上.
这就是我尝试过的:
MainActivity.java
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView = (ListView) findViewById(android.R.id.list);
final LayoutInflater inflater = LayoutInflater.from(this);
listView.setAdapter(new BaseAdapter() {
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
View rootView = convertView;
if (rootView == null) {
rootView = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
((TextView) rootView.findViewById(android.R.id.text1)).setText("Test");
}
return rootView;
}
@Override
public long getItemId(final int position) {
return …Run Code Online (Sandbox Code Playgroud) android android-listview rippledrawable android-5.0-lollipop
从Lollipop开始,应用程序可以访问真正的SD卡(在Kitkat上无法访问之后,并且在之前的版本中尚未获得官方支持),正如我在此处所述.
因为看到支持SD卡的Lollipop设备变得非常罕见,并且因为模拟器实际上没有能力(或者它?)来模拟SD卡支持,所以我花了很长时间来测试它.
无论如何,似乎不是使用普通的File类来访问SD卡(一旦获得了它的许可),你需要使用Uris来使用它,使用DocumentFile.
这限制了对正常路径的访问,因为我找不到将Uris转换为路径的方法,反之亦然(加上它非常烦人).这也意味着我不知道如何检查当前的SD卡是否可访问,因此我不知道何时要求用户允许读取/写入(或向他们).
目前,这就是我获取所有SD卡的路径:
/**
* returns a list of all available sd cards paths, or null if not found.
*
* @param includePrimaryExternalStorage set to true if you wish to also include the path of the primary external storage
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static List<String> getExternalStoragePaths(final Context context,final boolean includePrimaryExternalStorage)
{
final File primaryExternalStorageDirectory=Environment.getExternalStorageDirectory();
final List<String> result=new ArrayList<>();
final File[] externalCacheDirs=ContextCompat.getExternalCacheDirs(context);
if(externalCacheDirs==null||externalCacheDirs.length==0)
return result;
if(externalCacheDirs.length==1)
{
if(externalCacheDirs[0]==null)
return result;
final String storageState=EnvironmentCompat.getStorageState(externalCacheDirs[0]);
if(!Environment.MEDIA_MOUNTED.equals(storageState))
return …Run Code Online (Sandbox Code Playgroud) 我有一个root设备,它是Galaxy S3 I9300,基于Android 4.3的三星基于股票的ROM.
运行我正在使用此设备的应用程序时,我从未遇到任何问题.
从昨天开始(我没有更改设备上的任何内容),每次打开应用程序时,它都显示很短的时间,关闭自己没有任何崩溃对话框,但它显示下一个日志:
01-30 09:27:18.325: E/DatabaseUtils(2366): Writing exception to parcel
01-30 09:27:18.325: E/DatabaseUtils(2366): java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
01-30 09:27:18.325: E/DatabaseUtils(2366): at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:13140)
01-30 09:27:18.325: E/DatabaseUtils(2366): at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2038)
01-30 09:27:18.325: E/DatabaseUtils(2366): at com.android.providers.settings.SettingsProvider.callFromPackage(SettingsProvider.java:607)
01-30 09:27:18.325: E/DatabaseUtils(2366): at android.content.ContentProvider$Transport.call(ContentProvider.java:279)
01-30 09:27:18.325: E/DatabaseUtils(2366): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:273)
01-30 09:27:18.325: E/DatabaseUtils(2366): at android.os.Binder.execTransact(Binder.java:388)
01-30 09:27:18.325: E/DatabaseUtils(2366): at dalvik.system.NativeStart.run(Native Method)
Run Code Online (Sandbox Code Playgroud)
它甚至没有得到扩展Application的类的代码......
似乎这个问题非常普遍(许多人已经报道过这个问题),但我找不到任何解决方案以及为什么会出现这种情况,除了拥有一个有根设备.
人们还说这里写的权限实际上是一个系统权限,但我从来没有听说过它,更不用说使用它了(甚至不确定它是什么). …
Facebook应用程序在帖子上的小图像和用户也可以缩放到它的放大模式之间有一个很好的过渡动画.
在我看来,动画不仅根据以前的位置和大小放大和移动imageView,而且还显示内容而不是拉伸imageView的内容.
这可以通过我做的下一个草图看到:

他们是如何做到的呢?他们真的有2个观点动画来揭示内容吗?
他们是如何使它变得如此流畅,就像它是一个单一的视图?
当缩略图设置为中心裁剪时,我已经看到(链接在这里)的图像被放大到全屏的唯一教程不能很好地显示.
不仅如此,它甚至可以在Android的低API上运行.
有人知道有类似能力的图书馆吗?
编辑:我找到了一个方法,并发布了一个答案,但它是基于更改layoutParams,我认为它没有效率和推荐.
我尝试过使用正常的动画和其他动画技巧,但是现在这是唯一对我有用的东西.
如果有人知道该怎么做以使其更好地工作,请写下来.
android ×10
aapt ×1
android-collapsingtoolbarlayout ×1
android-doze ×1
android-ndk ×1
apk ×1
crop ×1
documentfile ×1
file ×1
google-play ×1
hebrew ×1
root ×1
textview ×1
uri ×1