我需要创建一个包含多种语言字符串的应用程序,包括RTL(从右到左)语言.我想知道Android上的RTL(从右到左)支持的当前状态(即使在最新的API上),例如:
是否可以动态/静态地检查设备的当前语言是否为RTL类型?我知道可以获取当前的语言环境,但我需要一种更通用的方法来检查当前语言是否为RTL.例如,对于英语和法语,它将返回false,但对于阿拉伯语和希伯来语,它将返回true.
是否可以设置一个布局自动镜像为RTL语言?例如,如果linearLayout(具有水平方向)的子项为1-> 2,则现在它将具有2 <-1,并且将在左侧创建新子项.
是否有一个限定符添加到将处理所有RTL语言的资源文件夹?例如,"res/layout"用于LTR(从左到右),"res/layout-rtl"用于RTL语言.
似乎eclipse的内容辅助建议使用linearLayout的"android:layoutDirection"和textView的"android:textDirection",但是当我选择它们时,我得到一个它无法识别它们的编译错误.我也无法在互联网上找到有关这些属性的更多信息.他们是什么意思,为什么我不能使用它们?
编辑:似乎Android 4.1在RTL语言上有一些改进.不知道它们是什么以及我可以在哪里阅读它们.
创建一个具有大量高质量图像的应用程序,我决定将图像缩小到所需的大小(这意味着如果图像大于屏幕,我会缩小它的尺寸).
我注意到在某些设备上,如果图像缩小,它们变得模糊/像素化,但在同一设备上,对于相同的目标imageView大小,如果图像没有缩小尺寸,它们看起来很好.
我已经决定进一步检查这个问题,并创建了一个显示问题的小型POC应用程序.
在向您展示代码之前,这里是我正在谈论的演示:

看到差异有点难,但你可以看到第二个有点像素化.这可以在任何图像上显示.
public class MainActivity extends Activity
{
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView originalImageView=(ImageView)findViewById(R.id.originalImageView);
final ImageView halvedImageView=(ImageView)findViewById(R.id.halvedImageView);
final ImageView halvedBitmapImageView=(ImageView)findViewById(R.id.halvedBitmapImageView);
//
final Bitmap originalBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test);
originalImageView.setImageBitmap(originalBitmap);
halvedImageView.setImageBitmap(originalBitmap);
//
final LayoutParams layoutParams=halvedImageView.getLayoutParams();
layoutParams.width=originalBitmap.getWidth()/2;
layoutParams.height=originalBitmap.getHeight()/2;
halvedImageView.setLayoutParams(layoutParams);
//
final Options options=new Options();
options.inSampleSize=2;
// options.inDither=true; //didn't help
// options.inPreferQualityOverSpeed=true; //didn't help
final Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test,options);
halvedBitmapImageView.setImageBitmap(bitmap);
}
}
Run Code Online (Sandbox Code Playgroud)
XML:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity"
android:fillViewport="true">
<HorizontalScrollView android:layout_width="match_parent"
android:fillViewport="true" android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent" …Run Code Online (Sandbox Code Playgroud) Google 在这里有一个适用于所有AOSP应用的网站,其中包括其启动器,联系人等...
我想知道如何导入这些应用程序.更具体地说,发射器和联系人应用程序(虽然我也想了解其他人).
事情是,它并不那么简单.你不能只导入克隆的项目,就是这样.即使您使用Eclipse(这似乎是这些存储库中使用的官方工具,根据文件夹hirerchy),它也不会那么容易.
我发现了一篇关于如何导入启动器(版本4.4.x)的旧文章,但它使用的是Eclipse,我认为需要Linux来构建一些文件.
我试图使用Eclipse导入,但由于某种原因,我无法使用工作的"protobuf"库.我试过从这里使用一个jar ,但它没有成功导入它.
还有一个不错的第三方库,它有一个导入版本的启动器应用程序,但目前它有点落后,因为它基于Kitkat(4.4)而不是Lollipop(5.0).
你如何进口这些项目?有一个简单的方法吗?它甚至可以在Windows操作系统和Android Studio上运行吗?
我正在尝试更新联系人数据,并将每个数据的生日.
似乎对于我尝试的每个设备(我甚至没有尝试过那么多设备),插入有一个或多个这些问题:
我尝试过使用时间戳和完整的ISO8601格式(因为这个链接,意思是"yyyy-MM-dd HH:mm:ss").我也试过"yyyy-MM-dd",我尝试使用设备日期的默认格式.
所有人都有上述问题(每个问题至少有一个).
这是一段代码:
final Date birthdate = ...
// String birthdateStr = new SimpleDateFormat("yyyy-MM-dd").format(birthdate);
// String birthdateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(birthdate);
// String birthdateStr = new SimpleDateFormat(((SimpleDateFormat) java.text.DateFormat.getDateInstance(java.text.DateFormat.DEFAULT, Locale.getDefault())).toLocalizedPattern(),Locale.getDefault()).format(birthdate);
String birthdateStr = Long.toString(birthdate.getTime()/1000);
final Builder builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValue(Data.RAW_CONTACT_ID, ...)
.withValue(ContactsContract.Data.MIMETYPE, Event.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthdateStr)
.withValue(ContactsContract.CommonDataKinds.Event.TYPE,
ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY);
Run Code Online (Sandbox Code Playgroud)
当然,我也在这里看过这个问题,并发现了类似的问题,但是提出的解决方案似乎都没有奏效.
我应该如何将生日插入联系人?为什么每个设备都有自己的方式来解释日期?生日的正确标准是什么?
假设我想使用ImageView显示某些内容的图像,我想在其上面放置新视图(例如,在世界地图图像上显示图钉的动画ImageView,或智能手机图像顶部的切换视图) ).
这意味着无论ImageView如何显示图像,视图都应该在其中,在正确的位置内,具有与指定相同的大小,或者与imageView本身相关的大小
与其他视图相反,ImageView可以具有一定的大小,但其内容是其他内容(保持宽高比).
我试图使用ConstraintLayout,但这并没有真正帮助,因为ImageView可以改变它的大小(例如在更改方向时),从而破坏了我给出了与ImageView相比的视图的位置.
我发现一些库可以处理类似的事情(比如这里),我甚至在此之前问过类似的问题,但是所有这些解决方案都是针对ImageView中的静态图像,但我搜索的是添加一个视图在ImageView之上.
如何正确地将视图放在ImageView的内容之上?
与ImageView内容的大小相比,如何向下/向上缩放视图?
可以使用ConstraintLayout根据ImageView的大小更改视图的比例吗?
我正在开发一个有很多画布而不是多个视图的库(可在这里找到).
当我努力改进它并使其适合我们对应用程序的需求(需要一些自定义)时,我注意到有一些行被标记为已弃用:
canvas.clipRect(0f, mHeaderHeight + mHeaderRowPadding * 2, mHeaderColumnWidth, height.toFloat(), Region.Op.REPLACE)
Run Code Online (Sandbox Code Playgroud)
事实上,我不认为有一个很好的候选人用新的API替换这行代码
看看文档,这是写的:
此方法在API级别26中已弃用.Interface.Op除INTERSECT和DIFFERENCE之外的值可以展开剪辑.画布剪辑API仅用于作为还原操作的结果展开剪辑.这使视图父级能够剪切画布以清楚地定义其子画面的最大绘制区域.推荐的替代调用是clipRect(RectF)和clipOutRect(RectF);
所以我尝试使用这些功能中的任何一个,但是它们都引起了以前的绘制问题.
看看弃用,似乎标记了函数本身,而不是Region.Op.REPLACE:
所以也许它真的没有替代品......
当用户下载新图像或使用相机捕获图像时,图库应用程序将更新以显示新图像.
我需要在每个新图像创建后立即得到通知,无论它是如何创建的(相机,浏览器......),就像图库应用程序显示的那样.
事实证明,有一个mediaScanner Android组件负责扫描所有类型的媒体文件,当它完成时,它应该发送一个意图" MEDIA_SCANNER_FINISHED "(如本例所示).
所以我添加了下一个代码,希望每次用户从相机应用程序拍摄照片时都会显示吐司:
表现:
...
<receiver android:name="com.example.newgalleryimagereceivertest.MediaScannerBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_SCANNER_FINISHED" />
<data android:scheme="file" />
</intent-filter>
</receiver>
...
Run Code Online (Sandbox Code Playgroud)
java文件:
package com.example.newgalleryimagereceivertest;
...
public class MediaScannerBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
android.util.Log.d("AppLog", "gallery has new images");
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这段代码不起作用......
代码有什么问题?
拍摄照片后是否会调用broadcastReceiver?
这样做的正确方法是什么?
我真的需要使用contentObserver并监视其变化(使用类似这样),并保持这只是运行的应用程序?我真的希望不...
media android broadcastreceiver android-camera android-mediascanner
我有一个App-Manager应用程序,允许将APK文件发送到其他应用程序.
直到Android 4.4(包括),我必须为此任务执行的操作是将路径发送到原始APK文件(所有这些都在"/ data/app/..."下,即使没有root也可以访问).
这是发送文件的代码(此处提供的文档):
intent=new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setType("*/*");
final ArrayList<Uri> uris=new ArrayList<>();
for(...)
uris.add(Uri.fromFile(new File(...)));
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,uris);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET|Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
Run Code Online (Sandbox Code Playgroud)
我做了什么工作,因为所有应用程序的APK文件都有一个唯一的名称(这是他们的包名称).
自从Lollipop(5.0)以来,所有应用程序的APK文件都被命名为"base.APK",这使得其他应用程序无法理解附加它们.
这意味着我有一些选项来发送APK文件.这就是我在想的:
将它们全部复制到一个文件夹,将它们全部重命名为唯一的名称,然后发送它们.
将它们全部压缩到一个文件然后发送它.压缩级别可能很小,因为APK文件已经被压缩了.
问题是我必须尽快发送文件,如果我真的必须拥有这些临时文件(除非有其他解决方案),也要尽快处理它们.
事实是,当第三方应用程序处理完临时文件时,我没有得到通知,我也认为选择多个文件需要花费一些时间来准备,无论我选择什么.
另一个问题是某些应用程序(如Gmail)实际上禁止发送APK文件.
有没有我想到的解决方案的替代方案?有没有办法解决这个问题与我以前的所有优势(快速和没有垃圾文件留下)?
也许某种方式来监控文件?或创建一个流而不是一个真正的文件?
将临时文件放在缓存文件夹中会有什么帮助吗?
就像标题说的那样...
我正在使用活动之间的转换,并且我希望为这两个活动提供某种监听器(或事件),以便在转换完成时以及在它开始之前.
以下是创建转换的示例代码:
final Intent intent = new Intent(activity, TargetActivity.class);
if (initialQuery != null)
intent.putExtra(EXTRA_INITIAL_QUERY, initialQuery);
final String transitionName = activity.getString(R.string.transition_name);
ViewCompat.setTransitionName(viewToTransitionFromAndTo, transitionName);
final ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
viewToTransitionFromAndTo, transitionName);
ActivityCompat.startActivityForResult(activity, intent, requestCode, options.toBundle());
Run Code Online (Sandbox Code Playgroud) android android-activity android-transitions android-5.0-lollipop
我有2个RecyclerView实例.一个是水平的,第二个是垂直的.
它们都显示相同的数据并且具有相同数量的项目,但是以不同的方式,并且单元格的大小不必相等.
我希望滚动到一个将与另一个同步,以便在一个上显示的第一个项目将始终显示在另一个上(作为第一个).
即使我成功地使它们同步(我只选择哪一个是"主",控制另一个的滚动),滚动的方向似乎影响它的工作方式.
假设片刻具有相同的高度:
如果我向上/向左滚动,它或多或少地按照我的意图工作:
但是,如果我向下/向右滚动,它会让其他RecyclerView显示另一个的第一项,但通常不会作为第一项:
注意:在上面的截图中,我已经在底部的RecyclerView中滚动,但是类似的结果将与顶部的一起.
如果像我写的那样,细胞有不同的大小,情况会变得更糟:
我尝试使用其他滚动方式并转到其他位置,但所有尝试都失败了.
使用smoothScrollToPosition使事情变得更糟(虽然它看起来确实更好),因为如果我扔了,在某些时候,其他RecyclerView控制我与之交互的那个.
我想我应该使用滚动的方向,以及其他RecyclerView上当前显示的项目.
这是当前(示例)代码.请注意,在实际代码中,单元格可能没有相同的大小(有些是高,有些是短等等).代码中的一行使单元格具有不同的高度.
activity_main.xml中
<android.support.constraint.ConstraintLayout
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" tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/topReccyclerView" android:layout_width="0dp" android:layout_height="100dp"
android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp"
android:orientation="horizontal" app:layoutManager="android.support.v7.widget.LinearLayoutManager"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" tools:listitem="@layout/horizontal_cell"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/bottomRecyclerView" android:layout_width="0dp" android:layout_height="0dp"
android:layout_marginBottom="8dp" android:layout_marginEnd="8dp" android:layout_marginStart="8dp"
android:layout_marginTop="8dp" app:layoutManager="android.support.v7.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/topReccyclerView"
tools:listitem="@layout/horizontal_cell"/>
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
horizontal_cell.xml
<TextView
android:id="@+id/textView" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="100dp" android:layout_height="100dp"
android:gravity="center" tools:text="@tools:sample/lorem"/>
Run Code Online (Sandbox Code Playgroud)
vertical_cell.xml
<TextView
android:id="@+id/textView" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="50dp"
android:gravity="center" tools:text="@tools:sample/lorem"/>
Run Code Online (Sandbox Code Playgroud)
主要活动
class MainActivity : AppCompatActivity() {
var masterView: View? = …Run Code Online (Sandbox Code Playgroud)