小编Tha*_*man的帖子

如何使用appCompat 22.1及更高版本的新AlertDialog并设置其样式

我正在尝试从默认的android迁移AlertDialog到appCompat-22.1中包含的新的android 到目前为止我了解你只需导入android.support.v7.app.AlertDialog包以便使用它.

但我怎么样呢呢?例如,更改正/负按钮颜色,标题颜色,消息颜色和背景颜色?

android android-appcompat android-alertdialog android-support-library

149
推荐指数
4
解决办法
13万
查看次数

单元测试加载本机库的Java类

我在Android Studio中运行单元测试.我有一个Java类,使用以下代码加载本机库

 static
    {
       System.loadLibrary("mylibrary");
    }
Run Code Online (Sandbox Code Playgroud)

但是当我在我的src/test目录中测试这个类时,我得到了

java.lang.UnsatisfiedLinkError: no mylibrary in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
Run Code Online (Sandbox Code Playgroud)

如何才能找到原生.so库的路径,src/main/libs以便进行单元测试而不出错?

注:里面src/main/libs的目录我有3个子目录:armeabi,mipsx86.其中每一个都包含正确的.so文件.我正在使用非实验版本来构建NDK库.

我不想使用其他第三方测试库,因为我所有其他"纯"java类都可以进行单元测试.但如果那是不可能的,那么我愿意接受替代方案.

这是我的测试代码,它会抛出错误

   @Test
    public void testNativeClass() throws Exception
    {
        MyNativeJavaClass test = new MyNativeJavaClass("lalalal")
        List<String> results = test.getResultsFromNativeMethodAndPutThemInArrayList();
        assertEquals("There should be only three result", 3, results.size());
    }
Run Code Online (Sandbox Code Playgroud)

java android unit-testing junit4

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

Admob广告和Firebase广告之间的差异

我正在尝试从Google分析迁移到新的Firebase分析,但我注意到还有广告库.firebase广告是否也将取代admob广告?我应该继续通过谷歌播放服务使用admob吗?或者切换到Firebase SDK?反正有什么不同?

android admob firebase

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

在Google Play服务第22版中找不到LocationClient类

我刚刚将google play服务更新为rev 22,并且该LocationClient课程似乎缺失了.到底是怎么回事?

android google-play-services eclipse-luna

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

使用appCompat 23+创建自定义材质对话框的正确方法

好的,我真的很困惑如何使用最新的appcompat v23.0.1正确地创建自定义对话框这里有几种方法

第一种方式:

public class AddTipDialogFrag extends DialogFragment
{
 @Override
 public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        int title = getArguments().getInt("title");
        AppCompatDialog dialogCompat = new AppCompatDialog(getActivity(), R.style.MyAlertDialogStyle);
        dialogCompat.setTitle(title); //doesn't work btw
        dialogCompat.setContentView(R.layout.add_tip_fragment);
        return dialogCompat;
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方式:

public class AddTipDialogFrag extends AppCompatDialogFragment
{ 
   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.add_tip_fragment,container, false);
        int title = getArguments().getInt("title");
        getDialog().setTitle(title);
        return view;
    }
}
Run Code Online (Sandbox Code Playgroud)

两种方式似乎产生相同的结果.我个人更喜欢第一种方式,但是当连线视图边框结束时会出现涟漪效应问题,如下图所示.

涟漪效应失败

这是一个错误吗?(一定是!)我可以修复它还是应该转换到第二种方式?(这对涟漪效果很好).考虑到大多数材料对话框库使用第一种方式,这两种方法之间的最佳方法是什么?

编辑:第一种方式上的波纹故障似乎不再发生,所以我仍然不确定哪两种是正确的方式.

android android-appcompat android-dialog android-dialogfragment

20
推荐指数
1
解决办法
8850
查看次数

在 ViewModel 中收集流。是否需要repeatOnLifeCycle?

到目前为止,我曾经在活动/片段或 ViewModel 中收集我的流,如下所示

活动/片段

lifecycleScope.launch {
    myViewModel.readTokenCredentials().collect { data -> /* do something */ }
}
Run Code Online (Sandbox Code Playgroud)

视图模型

viewModelScope.launch {
    prefsRepo.readTokenCredentials().collect { data -> /* do something */ }
}
Run Code Online (Sandbox Code Playgroud)

现在,谷歌开发人员告诉我们,这不是一种收集流量的安全方法,因为它可能会导致内存泄漏。相反,他们建议将集合包装在lifecycle.repeatOnLifecycle“活动/片段”中以进行流集合。

lifecycleScope.launch {
    lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
        myViewModel.readTokenCredentials().collect { data -> /* do something */ }
    }   
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

为什么在视图模型内收集流时不能使用repeatOnLifecyclewith ?viewModelScope当然,我知道视图模型不具有生命周期意识,但viewModelScope在流收集期间可能不太可能引入内存泄漏?

android kotlin kotlin-coroutines

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

如何取消/取消订阅协程流程

我在尝试过早地从 Flow 中取消时注意到一个奇怪的行为。看看下面的例子。

这是一个发出整数值的简单流程

  private fun createFlow() = flow {
        repeat(10000) {
            emit(it)
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我createFlow使用此代码调用该函数

  CoroutineScope(Dispatchers.Main).launch {
            createFlow().collect {

                Log.i("Main", "$it isActive $isActive")
                if (it == 2) {
                    cancel()
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

这是打印出来的

0 isActive true
1 isActive true
2 isActive true
3 isActive false
4 isActive false
etc...etc
Run Code Online (Sandbox Code Playgroud)

现在我希望流一旦达到 2 的值就应该停止发射整数,但实际上它会将 isActive 标志切换为 false 并继续发射而不停止。

当我在排放之间添加延迟时,流量的行为与我预期的一样。

private fun createFlow() = flow {
    repeat(10000) {
        delay(500) //add a delay
        emit(it)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是再次调用流程后打印出来的内容(这是预期的行为)。

0 isActive true
1 …
Run Code Online (Sandbox Code Playgroud)

android kotlin-coroutines kotlinx.coroutines.flow

15
推荐指数
2
解决办法
6114
查看次数

自动调整图像大小以适应比例但不拉伸

我想根据屏幕尺寸调整图像大小,但是当屏幕太大时我不希望该图像超过其实际像素.到目前为止,我设法做到了这一点

<div align="center" style="position:static; height: 100%; width: 100%; top:0;left 0;">
<img src="myImg.png" style="width: 80%">
</div>
Run Code Online (Sandbox Code Playgroud)

这样可以保持我想要的比例,但是当屏幕太大时,它也会拉伸图像.我不希望这样.

html css

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

Android M检测权限对话框是否可见

如何以编程方式确定用户是否可以看到权限对话框,以便我知道在这种情况下该怎么做?

android android-permissions android-6.0-marshmallow

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

在 Android 干净架构中映射到域的正确位置

我和我的同事正在争论哪里才是将实体对象或远程 dto 对象映射到简单域对象的正确位置。

我们的结构看起来像这样。

源(包括 dao)> 存储库(包括源)> 用例(包括存储库)

我的同事认为映射到域应该在源内部完成,以便域对象可以传递到下一层,如下所示

class SomeSourceImpl(private val dao: Dao) : SomeSource {
    override fun get(): Observable<DomainModel> {
        return dao.getResponse().map { it.mapToDomain() }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的同事认为,根据鲍勃叔叔的说法,这是由于依赖规则造成的。

该规则规定源代码依赖关系只能指向内部。内圈中的任何事物都无法了解外圈中的任何事物。特别是,在内圈中的代码中不得提及外圈中声明的内容的名称。这包括函数、类。变量,或任何其他命名的软件实体。

我非常不同意直接映射到源内部域的方法,因为这样存储库就会变得贫乏,我们因此采用贫乏存储库无用的反模式,它们所做的就是盲目传播来自源的所有内容。(现在你可能会说源也很贫乏,我们可以简单地删除它们并将 dao 对象直接包含到存储库中,但这在我们的例子中是不可能的)。

相反,我建议源返回原始数据库实体(如果我们进行休息调用,则返回远程实体),因为源返回原始数据以供以后处理是有意义的。存储库的工作是从源获取结果,然后将其映射到域,最后将此域对象传播到类似这样的用例。

class SomeRepoImpl(private val someSource: SomeSource) : SomeRepo {
    override fun get(haId: String): Observable<DomainModel> {
        return otherAssetSource.get().map { it.mapToDomain() }
    }
Run Code Online (Sandbox Code Playgroud)

我还在 github 上发现了一些示例,它们映射到存储库内的域而不是源

这里

这里

这里

也是 iOS 版的

关于可以将实体映射到域对象的位置,干净架构原则中的严格规则是什么?

android kotlin clean-architecture

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