小编ars*_*v31的帖子

在Kotlin中嵌套的lambda调用

在Kotlin中嵌套lambda调用时,我如何明确地引用child和parent的it元素?例如:

data class Course(var weekday: Int, var time: Int, var duration: Int)
var list1 = mutableListOf<Course>()
var list2 = mutableListOf<Course>()
// populate list1 and list2
// exclude any element from list1 if it has the same time and weekday as any element from list2
list1.filter { list2.none{it.weekday == it.weekday && it.time == it.time} }
Run Code Online (Sandbox Code Playgroud)

kotlin

17
推荐指数
1
解决办法
4317
查看次数

隐含地映射到Kotlin中

在我映射一个Set之后,我必须将它显式地转换回Set.例如:

fun getNewSet(oldSet: Set<String>): Set<String> {
return oldSet
        .map{ getNewStringFromOld(it) }
        .toSet()
}
Run Code Online (Sandbox Code Playgroud)

在没有明确地将其转换回Set的情况下映射整个集合的正确方法是什么?

kotlin

10
推荐指数
1
解决办法
2170
查看次数

计算Kotlin的位数

我正在使用简单的string.length方法计算位数:

val number = 829
val length = number.toString().length
Run Code Online (Sandbox Code Playgroud)

我想知道这是否是一种好方法,或者在Kotlin中有更合适的方法.

kotlin

10
推荐指数
1
解决办法
3815
查看次数

在gradle android库kotlin项目中禁用META-INF/*生成

美好的一天.我写了一个kotlin安卓库并将其上传到bintray.但是当我尝试在某个项目中使用它(通过gradle编译)时,它无法构建以下错误:

> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/library_release.kotlin_module
File1: C:\Users\Charlie\.android\build-cache\2939fbc6b0336396c9c4912d615880645b2c729d\output\jars\classes.jar
File2: C:\Users\Charlie\OneDrive\Dev\Projects\AndroidStudio\MetuCardLib\demo\build\intermediates\bundles\default\classes.jar
Run Code Online (Sandbox Code Playgroud)

我查找了这两个.jar文件,它们都包含META-INF文件夹library_release.kotlin_module.但更重要的是生成的.aar(在bintray中发布的android存档)包含此文件夹以及此文件.我检查了其他体面的bintray安卓库,他们似乎没有包含任何META-INF文件.但是那些包含它的(在大多数情况下它们包含许可证文件)产生的相同DuplicateFileException,解决它的方法是在use-project的gradle文件中明确地排除它们.

这个library_release.kotlin_module文件的用途是什么?如何在发布期间禁用它的生成?因为我不想从每个使用此库的项目中明确排除,我不想让其他开发人员这样做.

这是图书馆的回购:https://github.com/arslancharyev31/Anko-ExpandableTextView/ 它是bintray回购:https://bintray.com/arslancharyev31/android/Anko-ExpandableTextView

android gradle kotlin android-gradle-plugin kotlin-android-extensions

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

Android将碎片保存到导航抽屉中

在我的程序中我有一些片段,我可以通过点击该代码替换每个片段.我的问题是:这些片段加载很少,点击每个片段后,从中创建新片段并在点击片段后再次加载.如何保存片段内容或状态并防止重新加载?

@Override
    public void onNavigationDrawerItemSelected(int position) {
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new InfoFragment();
                break;
            case 1:
                fragment = new ParentOtoFragment();
                break;
            case 2:
                fragment = new ParentProFragment();
                break;
            case 3:
                fragment = new SupportFragment();
                break;
            case 4:
                fragment = new AboutFragment();
                break;
        }
        if (fragment != null){
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.container,fragment).commit();
        }
    }
Run Code Online (Sandbox Code Playgroud)

更新后

@Vikram Ezhil回复此主题之后我是首字母fragmentsfragmentTAG进入构造函数并将@Vikram Ezhil代码更改为以下代码,我的问题解决了.

@Override
   public void …
Run Code Online (Sandbox Code Playgroud)

android android-fragments

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

Android xml捆绑包格式无法识别aapt属性

我已尝试使用Android 文档中提供的示例使用Android xml捆绑包格式,但Android Studio仍然这样说

应该定义'drawable'或'animation'属性(见截图)

在这种情况下可以做些什么来修复错误?

<!-- drawable\some_anim.xml-->
<animated-vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable">
    <vector
        android:width="64dp"
        android:height="64dp"
        android:viewportHeight="600"
        android:viewportWidth="600">
        <group
            android:name="rotationGroup"
            android:pivotX="300.0"
            android:pivotY="300.0"
            android:rotation="45.0">
            <path
                android:name="v"
                android:fillColor="#000000"
                android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z"/>
        </group>
    </vector>
</aapt:attr>

<target android:name="rotationGroup">
    <aapt:attr name="android:animation">
        <objectAnimator
            android:duration="6000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"/>
    </aapt:attr>
</target>

<target android:name="v">
    <aapt:attr name="android:animation">
        <set>
            <objectAnimator
                android:duration="3000"
                android:propertyName="pathData"
                android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z"
                android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"
                android:valueType="pathType"/>
        </set>
    </aapt:attr>
</target>
Run Code Online (Sandbox Code Playgroud)

android android-animation aapt android-vectordrawable

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

在Kotlin没有吸气剂的财产

如何使用自定义setter声明属性,但在Kotlin中没有getter?例如,在Anko中,他们这样做:

var myProperty: Type
    @Deprecated(AnkoInternals.NO_GETTER, level = DeprecationLevel.ERROR) 
    get() = AnkoInternals.noGetter()
    set(value) { field = value; /* setter logic */ }
Run Code Online (Sandbox Code Playgroud)

但它对我来说看起来有些笨拙.这是一种正确的方法吗?如果是,那么当项目没有Anko依赖时呢?

PS让我明确一点 - 我想完全没有吸气剂,而不是私人吸气剂

kotlin

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

如何从`decltype(&lt;function&gt;)` 获取函数参数的数量?

假设我有以下函数声明:

template<typename signature>
int foo();
Run Code Online (Sandbox Code Playgroud)

鉴于上述函数,是否可以以foo这种方式定义,使其返回在decltype模板参数中传递的函数参数的数量?

所以示例用法可能如下所示:

int bar(int a, int b) 
{
    return a + b;
}

int jar(int a)
{
    return a * a;
}

int main() 
{
    std::cout << foo<decltype(bar)>() << std::endl; // Desired output: 2
    std::cout << foo<decltype(jar)>() << std::endl; // Desired output: 1
}
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢所有人的回复。他们似乎工作。但是,我忘了提及另一个用例。

假设我想获取以下函数的参数数量:

int __stdcall car(int a, int b, int c)
{
    return a * b + c;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,答案似乎不适用于这种使用__stdcall约定的函数。

知道为什么以及可以做些什么吗?

c++ templates arguments function count

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

Rust 中强制转换为推断函数类型

假设我们有一个FARPROC作为某些Win32操作的结果而收到的类型,例如GetProcAddress. 它的定义如下:

pub type FARPROC = unsafe extern "system" fn() -> isize;
Run Code Online (Sandbox Code Playgroud)

然后需要将该类型转换为有效的函数类型,以便我们可以调用它。作为开发人员,我们知道函数签名(来自文档),但我们需要将这些知识传递给编译器。一种简单的方法是使用transmute显式函数类型,如下所示:

let address: FARPROC = unsafe { GetProcAddress(module, proc).unwrap() };
let function: extern "system" fn(i32) = unsafe { transmute (&address) };
Run Code Online (Sandbox Code Playgroud)

但是,如果我们想从 Rust 代码中定义的现有函数之一推断函数类型怎么办?假设我们有一些定义很长的函数:

pub fn foo(arg1: i32, arg2: c_void, arg3: *const c_char) {
   // snip
}
Run Code Online (Sandbox Code Playgroud)

为了保持我们的代码干燥,是否可以将该函数类型与 一起使用transmute

我尝试的解决方案如下所示:


pub fn cast_to_function<F>(address: FARPROC, _fn: &F) -> F {
    unsafe { transmute_copy(&address) }
}

/// Usage …
Run Code Online (Sandbox Code Playgroud)

generics rust

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

如何在 Jetpack Compose Navigation 中保留 WebView 状态?

当使用WebView显示HTML内容,并使用新的Activity显示新页面时,当打开/关闭新的WebView活动时,操作系统会自动保留和恢复所有WebView的状态。这带来了不间断的反向导航用户体验。

话虽如此,我想知道在使用Jetpack Compose Navigation或任何围绕它提供高级导航 API 的第三方库时是否可以复制这样的体验?如果我理解正确的话,当前的问题是在单活动架构下,可组合项被完全处置和重新创建。我们需要在生命周期感知组件(例如 ViewModel)中保留持久状态。问题是,我找不到一种方法来使用 WebView 来实现这一点,即使使用Accompanist库提供的方法也是如此。缺乏完整的状态恢复会导致返回时丢失当前加载的页面以及滚动位置,从而极大地损害用户体验。我尝试了课堂上的方法saveStaterestoreState方法WebView,但没有成功。因此,如果有人能够展示一个工作示例,说明如何在使用 Compose 导航 API 时在反向导航时完全保存和恢复 WebView 的状态,我将不胜感激。

android webview android-jetpack-compose jetpack-compose-navigation

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