小编and*_*per的帖子

Android上从右到左语言的状态是什么?

我需要创建一个包含多种语言字符串的应用程序,包括RTL(从右到左)语言.我想知道Android上的RTL(从右到左)支持的当前状态(即使在最新的API上),例如:

  1. 是否可以动态/静态地检查设备的当前语言是否为RTL类型?我知道可以获取当前的语言环境,但我需要一种更通用的方法来检查当前语言是否为RTL.例如,对于英语和法语,它将返回false,但对于阿拉伯语和希伯来语,它将返回true.

  2. 是否可以设置一个布局自动镜像为RTL语言?例如,如果linearLayout(具有水平方向)的子项为1-> 2,则现在它将具有2 <-1,并且将在左侧创建新子项.

  3. 是否有一个限定符添加到将处理所有RTL语言的资源文件夹?例如,"res/layout"用于LTR(从左到右),"res/layout-rtl"用于RTL语言.

  4. 似乎eclipse的内容辅助建议使用linearLayout的"android:layoutDirection"和textView的"android:textDirection",但是当我选择它们时,我得到一个它无法识别它们的编译错误.我也无法在互联网上找到有关这些属性的更多信息.他们是什么意思,为什么我不能使用它们?

编辑:似乎Android 4.1在RTL语言上有一些改进.不知道它们是什么以及我可以在哪里阅读它们.

resources android locale right-to-left

14
推荐指数
1
解决办法
6915
查看次数

如何正确下采样图像?

背景

创建一个具有大量高质量图像的应用程序,我决定将图像缩小到所需的大小(这意味着如果图像大于屏幕,我会缩小它的尺寸).

问题

我注意到在某些设备上,如果图像缩小,它们变得模糊/像素化,但在同一设备上,对于相同的目标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)

android decode bitmap downsampling pixelate

14
推荐指数
1
解决办法
2万
查看次数

如何将AOSP应用程序(启动器,联系人......)导入Android-Studio?

背景

Google 在这里有一个适用于所有AOSP应用的网站,其中包括其启动器,联系人等...

问题

我想知道如何导入这些应用程序.更具体地说,发射器联系人应用程序(虽然我也想了解其他人).

事情是,它并不那么简单.你不能只导入克隆的项目,就是这样.即使您使用Eclipse(这似乎是这些存储库中使用的官方工具,根据文件夹hirerchy),它也不会那么容易.

我发现了什么

我发现了一篇关于如何导入启动器(版本4.4.x)的旧文章,但它使用的是Eclipse,我认为需要Linux来构建一些文件.

我试图使用Eclipse导入,但由于某种原因,我无法使用工作的"protobuf"库.我试过从这里使用一个jar ,但它没有成功导入它.

还有一个不错的第三方库,它有一个导入版本的启动器应用程序,但目前它有点落后,因为它基于Kitkat(4.4)而不是Lollipop(5.0).

这个问题

你如何进口这些项目?有一个简单的方法吗?它甚至可以在Windows操作系统和Android Studio上运行吗?

eclipse android android-source android-studio

14
推荐指数
1
解决办法
4483
查看次数

将生日变成联系人数据的正确方法是什么?

背景

我正在尝试更新联系人数据,并将每个数据的生日.

问题

似乎对于我尝试的每个设备(我甚至没有尝试过那么多设备),插入有一个或多个这些问题:

  • 查看/编辑联系人时,无法单击和编辑brithdate.
  • 查看/编辑联系人时,显示的格式与用户输入生日时显示的格式不同
  • 缺少一年,或完全错误的一年.
  • 查看联系人时,未显示生日,但在编辑时,会显示生日.另外,相反.

我试过的

我尝试过使用时间戳和完整的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)

当然,我也在这里看过这个问题,并发现了类似的问题,但是提出的解决方案似乎都没有奏效.

这个问题

我应该如何将生日插入联系人?为什么每个设备都有自己的方式来解释日期?生日的正确标准是什么?

android date android-contacts android-sqlite

14
推荐指数
1
解决办法
553
查看次数

如何将视图放在ImageView的顶部,与ImageView的内容大小相关?

背景

假设我想使用ImageView显示某些内容的图像,我想在其上面放置新视图(例如,在世界地图图像上显示图钉的动画ImageView,或智能手机图像顶部的切换视图) ).

这意味着无论ImageView如何显示图像,视图都应该在其中,在正确的位置内,具有与指定相同的大小,或者与imageView本身相关的大小

问题

与其他视图相反,ImageView可以具有一定的大小,但其内容是其他内容(保持宽高比).

我尝试了什么

我试图使用ConstraintLayout,但这并没有真正帮助,因为ImageView可以改变它的大小(例如在更改方向时),从而破坏了我给出了与ImageView相比的视图的位置.

我发现一些库可以处理类似的事情(比如这里),我甚至在之前问过类似的问题,但是所有这些解决方案都是针对ImageView中的静态图像,但我搜索的是添加一个视图在ImageView之上.

这个问题

如何正确地将视图放在ImageView的内容之上?

与ImageView内容的大小相比,如何向下/向上缩放视图?

可以使用ConstraintLayout根据ImageView的大小更改视图的比例吗?

android imageview

14
推荐指数
1
解决办法
925
查看次数

`canvas.clipRect`与`Region.Op.REPLACE`的最佳替代方法是什么?

背景

我正在开发一个有很多画布而不是多个视图的库(可在这里找到).

问题

当我努力改进它并使其适合我们对应用程序的需求(需要一些自定义)时,我注意到有一些行被标记为已弃用:

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:

在此输入图像描述

所以也许它真的没有替代品......

问题

  1. 在这种情况下,最好的选择是什么?
  2. 为什么要弃用?
  3. 与一些不赞成使用的函数相反,我认为如果我找不到替代函数,这个函数应该是安全的,对吧?

android canvas

14
推荐指数
1
解决办法
5682
查看次数

如何获得图库应用程序可见的每个新图像的通知?

背景

当用户下载新图像或使用相机捕获图像时,图库应用程序将更新以显示新图像.

我需要在每个新图像创建后立即得到通知,无论它是如何创建的(相机,浏览器......),就像图库应用程序显示的那样.

问题

事实证明,有一个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

13
推荐指数
1
解决办法
4489
查看次数

如何将大文件或多个文件发送到其他应用程序,并知道何时删除它们?

背景

我有一个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文件.这就是我在想的:

  1. 将它们全部复制到一个文件夹,将它们全部重命名为唯一的名称,然后发送它们.

  2. 将它们全部压缩到一个文件然后发送它.压缩级别可能很小,因为APK文件已经被压缩了.

问题是我必须尽快发送文件,如果我真的必须拥有这些临时文件(除非有其他解决方案),也要尽快处理它们.

事实是,当第三方应用程序处理完临时文件时,我没有得到通知,我也认为选择多个文件需要花费一些时间来准备,无论我选择什么.

另一个问题是某些应用程序(如Gmail)实际上禁止发送APK文件.

这个问题

有没有我想到的解决方案的替代方案?有没有办法解决这个问题与我以前的所有优势(快速和没有垃圾文件留下)?

也许某种方式来监控文件?或创建一个流而不是一个真正的文件?

将临时文件放在缓存文件夹中会有什么帮助吗?

android file android-intent apk

13
推荐指数
1
解决办法
1829
查看次数

如何在活动之间的转换完成后收到通知?

就像标题说的那样...

我正在使用活动之间的转换,并且我希望为这两个活动提供某种监听器(或事件),以便在转换完成时以及在它开始之前.

以下是创建转换的示例代码:

    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

13
推荐指数
1
解决办法
7832
查看次数

如何同步2个RecyclerViews的滚动第一个位置?

背景

我有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)

horizo​​ntal_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)

android android-recyclerview

13
推荐指数
1
解决办法
1303
查看次数