小编Abu*_*suf的帖子

如何更改animateLayoutChanges机制使用的动画?

我有一个RecyclerView用户选择一个项目.选择后,某些视图在文本之前变为可见(参见图像).我想为它的外观设置动画.

图示

animateLayoutChanges 项目布局上的属性完美地完成了工作,除了视图外观的动画类型 - 它淡入.我希望它从0到100%大小缩放,我相信它被称为'弹出'动画.

如果我禁用animateLayoutChanges并使用XML动画,它可以工作,但附近的文本不再是动画的(它应该滑动以容纳视图及其边距的空间).它立即向右移动,然后播放动画.反向动画更糟糕,因为文本在视图消失之前会重叠视图.

所以我需要以某种方式组合默认机制和我自己的动画.如果不深入研究自定义动画,最简单的方法是什么?

layout animation android

19
推荐指数
1
解决办法
7299
查看次数

如何在android中检测Lowmemory?

我的应用程序有很多图像,有时由于内存不足而导致崩溃.我写了这个在开发者网站上找到的函数.

public void onLowMemory(){

}
Run Code Online (Sandbox Code Playgroud)

但问题是在低内存情况下永远不会调用此函数.我该怎么做才能调用这个函数.我需要在设备内存不足时提醒用户.

android

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

如何将同一个ViewModel实例同时提供给Parent和Child片段

有两个片段:ParentFragment和ChildFragment. ChildFragment已被添加到视图中ParentFragment.

现在使用Dagger2Android有ParentFragmentModule一个方法:

@Provides
fun provideViewModel(fragment: ParentFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
    return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}
Run Code Online (Sandbox Code Playgroud)

其中MyViewModelFactory,MyViewModel,MyViewModelImpl是在应用程序中创建的简单ViewModel逻辑.

并且ChildFragmentModule具有以下方法:

@Provides
fun provideViewModel(fragment: ChildFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
    return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}
Run Code Online (Sandbox Code Playgroud)

这显然是创建两个单独的实例,ViewModel因为它们接收两个不同的片段实例.

我们如何使它返回相同的实例,以便可以在Parent和Child片段之间共享数据?

我试过传递ParentFragment而不是ChildFragmentChildFragmentModule,但这导致Dagger依赖注入错误.

android dependency-injection mvvm dagger android-viewmodel

11
推荐指数
2
解决办法
5969
查看次数

我应该在销毁活动时手动关闭由我的应用程序创建的HandlerThreads吗?

我的应用程序由一个单独组成Activity.在这个活动中,我正在创建多个HandlerThreads,它们在循环中运行以执行套接字阻塞操作.

目前我HandlerThread在我的期间向这些人发布了一条戒烟信息Activity.onDestroy().

有时,当我打开我的应用程序,关闭它并重新启动它时,它会崩溃(很多时候是由于向未运行的处理程序线程发送消息).

我的问题是:关闭我的应用程序时关闭的正确方法HandlerThread什么(请注意,那些线程可能在套接字操作上阻塞).

编辑:更多信息: 我有一个处理程序线程池,它是在onCreate中启动的(当我第一次启动我的应用程序时没问题).

每个处理程序runnable循环都包含一个

 if (shouldRun) {
//body
} 
else { 
 close();
}
Run Code Online (Sandbox Code Playgroud)

声明.

close方法删除所有挂起的消息和runnables,并向处理程序发送一条消息,使其调用它looper.quit().这样,如果当前处理程序线程被IO操作阻止,只有一旦它完成它,他将退出().

android activity-lifecycle android-handler

9
推荐指数
1
解决办法
8388
查看次数

Android 处理 Jetpack Compose 屏幕上的生命周期事件

在 Jetpack Compose 中,所有屏幕都是可组合功能。FragmentsJetpack Compose 中未使用。

我们如何使用 Jetpack Compose 处理生命周期事件?如果我们使用 Fragment,我们可以处理生命周期事件 ( onStart/onPause/onResume/onStop)。这些对于释放资源、停止观察更改等不同场景很有用。

在 Jetpack Compose 中,如果我需要处理这些事件,我该如何在可组合屏幕中处理这些事件?

请帮助我提供一些想法或资源,以便我能够理解这一点。

提前致谢。

android android-lifecycle android-jetpack android-jetpack-compose

8
推荐指数
1
解决办法
7875
查看次数

如何在OpenGl中绘制线条?

我想在opengl中画一条线.

 glBegin(GL_LINES);
    glVertex2f(.25,0.25);
    glVertex2f(.75,.75);
glEnd();
Run Code Online (Sandbox Code Playgroud)

这段代码画线,但如果我想从坐标(10,10)到坐标(20,20)画一条线,我该怎么办?

这意味着什么(.25,.25)和(.75,.75)?

opengl line

7
推荐指数
2
解决办法
5万
查看次数

低于21的API级别的状态栏颜色未更改

API级别21或更高级别的状态栏颜色根据我的要求而变化,但是如何更改API级别21以下的颜色。

以下是两个API的屏幕截图

API级别21:

API等级19:

colors.xml

    <?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FFFFFF</color>
    <item name="b" type="color">#FF33B5E5</item>

    <item name="p" type="color">#FFAA66CC</item>

    <item name="g" type="color">#FF99CC00</item>

    <item name="o" type="color">#FFFFBB33</item>
</resources>
Run Code Online (Sandbox Code Playgroud)

Style.xml

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBarOverlay">false</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
    <item name="tabSelectedTextColor">@color/colorAccent</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> …
Run Code Online (Sandbox Code Playgroud)

xml android android-theme android-styles android-statusbar

7
推荐指数
2
解决办法
9239
查看次数

带有PendingIntent的FusedLocationApi用于后台位置更新.无法接收更新

来自谷歌的示例源代码很容易在前端实现连续的位置更新,但我仍然可以使用FusedLocationApi和PendingIntent清楚地了解背景位置更新是如何工作的.

LocationService类:

public class LocationService extends IntentService {
private static final String TAG = LocationService.class.getSimpleName();

private static final String ACTION_LOCATION_UPDATED = "location_updated";
private static final String ACTION_REQUEST_LOCATION = "request_location";

public static IntentFilter getLocationUpdatedIntentFilter() {
    return new IntentFilter(LocationService.ACTION_LOCATION_UPDATED);
}

public static void requestLocation(Context context) {
    Intent intent = new Intent(context, LocationService.class);
    intent.setAction(LocationService.ACTION_REQUEST_LOCATION);
    context.startService(intent);
}

public LocationService() {
    super(TAG);
}

@Override
protected void onHandleIntent(Intent intent) {
    String action = intent != null ? intent.getAction() : null;
    if (ACTION_REQUEST_LOCATION.equals(action)) {
        onRequestLocation();
    }
    else …
Run Code Online (Sandbox Code Playgroud)

android android-pendingintent android-fusedlocation

6
推荐指数
1
解决办法
4526
查看次数

GoogleApiClient onConnectionFailed,statusCode = SIGN_IN_REQUIRED

我正在尝试将我的应用程序连接到Google Play服务以访问Google云端硬盘,但它显示我与statusCode的连接失败SIGN_IN_REQUIRED.

但它似乎就在3天前表现得那样.我也检查了谷歌的开发者控制台.他们可能在API中改变了一些我无法弄清楚的东西.欢迎您的帮助.

我的代码:

/**
 * Create a new file and save it to Drive.
 */
    private void saveFileToDrive(final byte[] data) {
    // Start by creating a new contents, and setting a callback.
    Log.i(TAG, "Creating new contents.");
    //final Bitmap image = mBitmapToSave;
    Drive.DriveApi.newDriveContents(mGoogleApiClient)
            .setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {

                @Override
                public void onResult(DriveApi.DriveContentsResult result) {
                    // If the operation was not successful, we cannot do anything
                    // and must
                    // fail.
                    if (!result.getStatus().isSuccess()) {
                        Log.i(TAG, "Failed to create new contents.");
                        return; …
Run Code Online (Sandbox Code Playgroud)

android google-api google-api-client google-drive-android-api android-googleapiclient

5
推荐指数
1
解决办法
6839
查看次数

Android ViewModel 的职责是仅保存数据还是保存数据+视图控制器?

官方得知

ViewModel 类旨在以生命周期意识的方式存储和管理 UI 相关数据

但我认为很多开发人员ViewModel同时用作数据存储和控制器(例如调用存储库、数据的网络客户端)。我还使用 as 作为数据存储和视图控制器。

Android官方示例代码也有一些控制器逻辑。来自官方

class MyViewModel : ViewModel() {
  private val users: MutableLiveData<List<User>> by lazy {
     MutableLiveData().also {
        loadUsers()
     }
  }

  fun getUsers(): LiveData<List<User>> {
    return users
  }

  private fun loadUsers() {
    // Do an asynchronous operation to fetch users.
  }
}
Run Code Online (Sandbox Code Playgroud)

这里loadUsers可能会调用一些RepositoryNetworkClient。所以在这里它就像控制器一样。

我确信许多开发人员都这样做,但从定义上看ViewModel应该存储和管理 UI 相关数据,应该ViewModel充当控制器吗?

我发现了一些 stackoverflow 线程这个这个关于这个。

第一个接受的答案建议不要用作ViewModel控制器并使用 …

android android-mvp android-viewmodel android-architecture-components

5
推荐指数
1
解决办法
2057
查看次数

Apollo Android 中的多个模式

我在 Android 项目中使用 Apollo 客户端。我有 2 个架构文件,并将它们放在 2 个不同的目录中。

  1. src/main/graphql/com/example/data/search/schema.json
  2. src/main/graphql/com/example/data/user/schema.json

但是当我构建一个项目来通过 Apollo 生成代码时,它给了我一个错误:

ApolloGraphQL: By default, only one schema.json file is supported.

并建议我使用多个服务 构建输出:

ApolloGraphQL: By default, only one schema.json file is supported. Please use multiple services instead: 

apollo {
  service("search") {
    sourceFolder = "/.../app/src/main/graphql/com/example/data/search" 
  }

  service("customer") {
    sourceFolder = "/.../app/src/main/graphql/com/example/data/customer" 
  } 
}
Run Code Online (Sandbox Code Playgroud)

我还将其添加到我的build.gradle(应用程序级别)文件中,但仍然显示相同的构建错误。

请建议我如何解决这个错误

android apollo graphql apollo-client graphql-java

4
推荐指数
1
解决办法
3486
查看次数

使用retrofit2和rx java2发送高容量POSTS时出现OutOfMemoryException

我有一个应用程序与本地数据库(房间)和服务,POSTs所有"事件"来自数据库使用retrofit 2rxjava.当我发送大量POSTs(即1500+)时,应用程序会抛出一个OutOfMemoryException.我认为这是因为每次客户端发送新POST时它都会启动一个新线程.有没有办法阻止retrofit/ rxJava创建这么多线程?或者等待服务器响应是否更好?这是我的代码:

从本地db检索所有事件的类

public class RetreiveDbContent {

private final EventDatabase eventDatabase;

public RetreiveDbContent(EventDatabase eventDatabase) {
    this.eventDatabase = eventDatabase;
}

@Override
public Maybe<List<Event>> eventsList() {

 return eventDatabase.eventDao().getAllEvents()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
}
}
Run Code Online (Sandbox Code Playgroud)

接下来,我有一个服务,它通过db事件列表迭代并发布所有这些服务.如果后端发回成功,则从本地数据库中删除该事件.

    private void sendDbContent() {

    mRetreiveDbContent.eventsList()
            .subscribe(new MaybeObserver<List<Event>>() {

        @Override
        public void onSubscribe(Disposable d) {
        }

        @Override
        public void onSuccess(final List<Event> events) {


            Timber.e("Size of list from db " + events.size());
            final CompositeDisposable disposable = new CompositeDisposable(); …
Run Code Online (Sandbox Code Playgroud)

mobile post android

3
推荐指数
1
解决办法
466
查看次数

如何在运行时使用 dagger.android 从包中注入参数?

我正在努力思考Dagger 2,但遇到了一种情况,我不太确定如何正确解决。我用来dagger.android设置subcomponents每个活动和片段,其中每个子组件都有一个具有自己的依赖项的演示者。

问题是一个片段应该显示从网络获取的信息,因此我将 a 传递URL给片段以告诉它要显示什么。但我不确定如何Dagger解决对片段加载的依赖。我以为我需要一个subcomponent builder,但这显然是多余的,因为编译器消息告诉我它需要来自URL一个Provides方法。我还为 设立了一个限定符,URL并用它注释了片段中的一个方法。我以为Dagger可以捡起来,但我错了。有人可以告诉我如何最好地处理这种情况吗?

android dagger dagger-2

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