小编Kun*_*uno的帖子

排除特定的构建变体

我有两种默认的构建类型:debug/release和几种风格:prod/dev.

现在我想排除构建变体dev-release,但保留所有其他可能的组合.有没有办法实现这个目标?

android gradle android-gradle-plugin

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

onNext和onComplete的行为

我有一个Observable,无需发出值即可完成某些操作.我还有一个我希望Observable可以使用的对象列表.因此对于此列表中的所有元素:doSomething()

Observable.from(uris)
        .flatMap(new Func1<Uri, Observable<Void>>() {
            @Override
            public Observable<Void> call(Uri uri) {
                return createDoSomethingObservable(uri);
            }
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.io())
        .subscribe(new Observer<Void>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "completed");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Void aVoid) {
                Log.d(TAG, "next");
            }
        });
Run Code Online (Sandbox Code Playgroud)

以及创建Observable的方法:

Observable<Void> createDoSomethingObservable(final Uri uri) {
    return Observable.create(new Observable.OnSubscribe<Void>() {
        @Override
        public void call(Subscriber<? super Void> subscriber) {
            //doSomething
            subscriber.onNext(null);
            subscriber.onCompleted();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

现在,当我使用带有3个元素的List运行时,我得到:

next
next
next
completed
Run Code Online (Sandbox Code Playgroud)

这很好,因为这就是我想要的,但我不知道它为什么会起作用.首先我开始调用onComplete,因为最终observable完成了它的工作并完成了.但当然onNext永远不会在订阅者上调用.反过来也是如此.

所以我的问题是:

  1. 为什么onComplete只调用最后一个列表元素?
  2. 有没有更好的方法来解决这个问题?

android reactive-programming rx-java

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

RecyclerView滚动条在第一个项目后跳回到顶部

我创建了一个非常基本的RecyclerView示例.

布局:

<RelativeLayout 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=".MyActivity">

    <android.support.v7.widget.RecyclerView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"/>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

活动:

public class MyActivity extends Activity {

    RecyclerView mRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setAdapter(new TestAdapter());
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    }

    public static class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(android.R.layout.simple_list_item_1, viewGroup, false);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(ViewHolder viewHolder, int i) {
            viewHolder.tv.setText("Row " + (i + 1)); …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview

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

Android L预览动作栏颜色

如前所述这里我应该能够改变我的动作条的颜色,如果我定义我的风格原色.

<style name="AppTheme" parent="android:Theme.Material">
    <item name="android:colorPrimary">#ff0000</item>
</style>
Run Code Online (Sandbox Code Playgroud)

但是颜色仍然是浅灰色的默认颜色.我错过了什么吗?

android android-actionbar material-design android-5.0-lollipop

6
推荐指数
2
解决办法
3195
查看次数

Android L预览材质样式选项卡

在新的设计指南(向下滚动到底部)中,您可以看到标签在新材料设计中的外观.TabHost然而我仍然看起来非常Holo,没有底线动画,没有涟漪效果.这是我们必须自己实施的吗?

android android-tabhost android-tabs material-design android-5.0-lollipop

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

TransitionPropagation是否按预期工作?

假设我们有两个片段:AB

A 是可见的,我们要替换为 B

A有一个exitTransitionB有一个enterTransition

这两个过渡都定义了TransitionPropagation,它们用于延迟某些动画。那些通过TransitionPropagations收集启动延迟所需的值captureValues

将交易从提交A到时的期望B

  1. TransitionPropagation.captureValues被称为来自所有相关视图A的布局为exitTransitionA
  2. TransitionPropagation.captureValues被称为来自所有相关视图B的布局为enterTransitionB

我看到: TransitionPropagation.captureValues被称为从所有相关意见A的布局为exitTransitionA,然后TransitionPropagation.captureValues也被称为上意见相同的传播在B的布局中定义的。

这是怎么回事 为什么欣赏到B定向到exitTransitionA

android android-animation android-layout android-transitions fragment-transitions

6
推荐指数
0
解决办法
115
查看次数

为子项定义自定义ViewGroup属性

我正在寻找一种方法来定义他们的孩子使用的视图的自定义属性.例如layout_centerInParent,儿童RelativeLayoutslayout_span儿童的儿童TableLayouts.

android android-custom-view android-layout android-custom-attributes

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

是否记得有没有派生状态

在我找到的示例(此处此处)中,我看到它derivedStateOf始终包装在一个remember块中。检查重组计数,我没有看到两者之间的区别

val foo = remember { derivedStateOf { someState } }
Run Code Online (Sandbox Code Playgroud)

val foo = derivedStateOf { someState }
Run Code Online (Sandbox Code Playgroud)

谁能给我举一个结果会有所不同的例子吗?

编辑:所以我在这个例子中得到了不同的结果:

@Composable
fun Test() {
    var count by remember {
        mutableStateOf(0)
    }

    val moreThanOne = derivedStateOf {
        Log.d("foo", "Calculate")
        count > 1
    }

    Log.d("foo", "Read")
    moreThanOne.value

    Button(
        onClick = {
            Log.d("foo", "Clicked")
            count += 1
        }
    ) {
        Text(text = "Increment")
    }
}
Run Code Online (Sandbox Code Playgroud)

单击按钮两次会显示以下日志:

Read
Calculate
Clicked
Calculate
Clicked
Calculate
Read
Calculate …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose android-jetpack-compose-ui

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

挂起函数会阻塞主线程

我很难理解协程。这是一个非常简单的设置。和longComputation都是delay挂起函数。第一个阻塞主线程,后者则不会。为什么?

CoroutineScope(Dispatchers.Main).launch {
    val result = longComputation() // Blocks
    delay(10_000) // Doesn't block
}
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-android-extensions kotlin-coroutines

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

Scoped Storage - 下载文件夹访问

我的目标是 android 10,我不使用android:requestLegacyExternalStorage. 我用的是DownloadManager通过下载到下载文件夹:request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)。我收听下载完整广播,提取 uri ( file:///storage/emulated/0/Download/<name>.pdf) 并通过 .pdf 文件在 pdf 阅读器中打开它FileProvider。它有效......为什么?自 android 10 和范围存储以来,它不应该不起作用吗?为什么我可以访问下载文件夹中的文件?

编辑:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).listFiles()列出所有文件,尽管文档说:

为了提高用户隐私,不推荐直接访问共享/外部存储设备。当应用以 Q 为目标时,此方法返回的路径不再可供应用直接访问

android android-download-manager storage-access-framework android-10.0 scoped-storage

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