RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-302357

Wlad's questions

Martin Hope
Wlad
Asked: 2024-08-09 16:36:49 +0000 UTC

MVI 和 Compose 中的 SingleFlowEvent

  • 5

这里有一个代码示例

// Viewmodel

   sealed interface Event {
            object A : Event
            object B : Event
        }

        private val _event = Channel<Event>(Channel.UNLIMITED)
        val event = _event.receiveAsFlow()

        sealed interface Intent {
            class A : Intent
            class B : Intent
        }

        fun sendIntent(intent: Intent) {
            when (intent) {
                is Intent.A -> viewModelScope.launch { _event.send(Event.A) }
                is Intent.B -> viewModelScope.launch { _event.send(Event.B) }
            }
        }


// Compose UI 

@Composable
fun UI(){
    val vm = koinViewModel<TestVM.VM>()
    val event = remember { vm.event }
    Element1(event)
    LaunchedEffect(Unit){
        event.filterIsInstance<Event.A>().collect{
            // ловим А
        }
    }
}

@Composable
fun Element1(
    event : Flow<Event>
){
    LaunchedEffect(Unit){
        event.filterIsInstance<Event.B>().collect{
            // ловим B
        }
    }
}

本质上我们有两种类型的事件。

Event.A不以任何方式依赖于 UI。处理其事件是转换到另一个屏幕,显示 Toast 和其他类似事件。它可以很容易地放置在根函数中UI()

但这Event.B是一个取决于 UI 的事件。例如:用红色突出显示某些文本2秒,然后返回正常颜色。或将列表滚动到特定位置。
它应该是可以影响文本颜色或引用的地方ListState。必须在某些函数内。

此类代码的问题在于,如果我们有一个事件侦听器来过滤它们filterIsInstance,那么它会捕获它们,无论filterIsInstance
i.e.该事件被视为已在过滤阶段收集。并且没有考虑它没有通过过滤器的事实。

我看到了一种出路,但我不喜欢它:
放弃sealed Event相同的方法Channel<Event>并为每个事件创建自己的方法Channel<DataType>

告诉我在这种情况下该怎么办。

android
  • 2 个回答
  • 33 Views
Martin Hope
Wlad
Asked: 2024-04-23 20:40:11 +0000 UTC

Compose BasicTextField:从 ClipboardManager 缓冲区粘贴图片

  • 4

应用程序 - 自己的聊天。
当您尝试从剪贴板粘贴图片时如何捕获事件?
让 BasicTextField 本身保持为空。
最主要的是捕获事件并获取 Uri(获取 Uri 没有问题)
请告诉我在哪个方向挖掘以及这是否可能。
ps 根据电报判断 - 这是可能的。

java
  • 1 个回答
  • 18 Views
Martin Hope
Wlad
Asked: 2023-12-11 19:23:06 +0000 UTC

Compose:如果没有自己的可组合函数,代码的行为会很奇怪

  • 5

有这样的代码:

    @Composable
    fun FragmentA(navController: NavController) {
        val vm = viewModel(VM::class.java)
        val a by vm.a.observeAsState("")
        val b by vm.b.observeAsState("")
        Column {
            MyRandomBox()
            MyBox(a)
            MyBox2(b)
        }
    }


    @Composable
    fun MyRandomBox() {
        Text(text = UUID.randomUUID().toString())
    }

    @Composable
    fun MyBox(text: String) {
        Box {
            Log.e("!!!", "box-1")
            Text(text = text)
        }
    }

    @Composable
    fun MyBox2(text: String) {
        Box {
            Log.e("!!!", "box-2")
            Text(text = text)
        }
    }


    class VM : ViewModel() {

        val a = MutableLiveData<String>()
        val b = MutableLiveData<String>()

        init {
            viewModelScope.launch {
                (0..100).forEach {
                    a.value = "a-$it"
                    delay(1000)
                    b.value = "b-$it"
                    delay(1000)
                }
            }
        }
    }

它工作得很好:每秒 1 个 LiveDats 发生变化,并且只有发生变化的 Box 才会显示在日志中。
第一个文本中的值,因为它是在启动时随机创建的,所以仍然挂起(它不会再次随机化)。

但是如果你稍微改变一下代码,就像这样:

   Column {
//    MyRandomBox()
      Text(text = UUID.randomUUID().toString())
      MyBox(a)
      MyBox2(b)
        }

那么现在当您更改任何 LiveDates 时,第一个文本中的文本将再次随机化

为什么如果您将这段代码封装在自己的代码中,Composable-функцию一切都会按其应有的方式工作,但如果没有它,一切都不会?(就好像视图是从头开始重新创建的)

UPD

以下行为也不清楚:
取消了操作onClick

   @Composable
    fun FragmentA(navController: NavController) {
        val vm = viewModel(VM::class.java)
        val a by vm.a.observeAsState("")
        val b by vm.b.observeAsState("")
        Column {
            MyRandomBox()
            MyBox(a) {
                vm.rnd()
            }
            MyBox2(b)
        }
    }



 @Composable
    fun MyBox(text: String, onClick: () -> Unit) {
        Box {
            Log.e("!!!", "box-1")
            Text(text = text,
                modifier = Modifier
                    .clickable {
                        onClick()
                    }
            )
        }
    }

LOG

10:04:12.770  E  box-1
10:04:13.771  E  box-1
10:04:13.772  E  box-2
10:04:14.786  E  box-1
10:04:15.787  E  box-1
10:04:15.790  E  box-2
10:04:16.786  E  box-1
10:04:17.786  E  box-1
10:04:17.787  E  box-2

当它改变时,a它会被记录box-1
当b它改变时,它会被记录box-1+box-2
但如果你用它替换它vm.rnd(),Log.e()一切都会按预期工作。
为什么会发生这种情况?

android
  • 1 个回答
  • 123 Views
Martin Hope
Wlad
Asked: 2023-07-12 19:06:40 +0000 UTC

自己的库中的CustomView:如何更改默认属性值?

  • 6

有一个单独的模块 AndroidLibary
在其中我创建一个自定义视图
我创建自定义属性并给它们默认值

 <declare-styleable name="TestView">
        <attr name="_name_TestView" format="string" />
        <attr name="_info_TestView" format="string" />
    </declare-styleable>

    <style name="TestView">
        <item name="_name_TestView">test</item>
        <item name="_info_TestView">info</item>
    </style>

在代码中获取属性

context.theme.obtainStyledAttributes(
            attrs,
            R.styleable.TestView,
            0,
            0
        )

我将模块连接到项目,
我想更改项目 (而不是模块)的主题,以便默认属性_name_TestView为customTest. 怎么做?

查看代码

class TestView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null
) : FrameLayout(context, attrs, R.attr.TestViewAtr) {


    init {
        inflate(context, R.layout.test_view, this)
    }

    private val xml =
        context.theme.obtainStyledAttributes(
            attrs,
            R.styleable.TestView,
            0,
            0
        )

    val button by lazy { findViewById<Button>(R.id.testButton) }
    val textView by lazy { findViewById<TextView>(R.id.textView) }

    var text: String = xml.getStringOrThrow(R.styleable.TestView__name_TestView)
        .apply { text = this }
        set(value) {
            field = value
            button.setText(field)
        }

    var helpText: String = xml.getStringOrThrow(R.styleable.TestView__info_TestView)
        .apply { helpText = this }
        set(value) {
            field = value
            textView.text = field
        }


    private val closeXml = { xml.recycle() }.apply { this.invoke() }

}  
java
  • 1 个回答
  • 30 Views
Martin Hope
Wlad
Asked: 2023-05-02 16:55:21 +0000 UTC

如何在没有面具的情况下获得“裸体”文字?

  • 6

有一个文本掩码:xxx/13xx/xxx
有一个文本:222/1300/777
我怎样才能得到文本22200777?

.replace("/13", "")在一个例子上歪曲地工作222/1300/135

java
  • 2 个回答
  • 46 Views
Martin Hope
Wlad
Asked: 2022-08-04 14:51:05 +0000 UTC

如何通过 RDP 扔 Android 手机?

  • 1

有一个远程桌面(通过 RDP 连接)。
有一台家用电脑。拥有安卓设备。

我怎样才能扔掉手机以将其远程连接到 Android-Studio?

可以扔闪存驱动器、磁盘等。
但是当我选择手机时,什么也没有发生。

android
  • 2 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2022-07-20 14:43:47 +0000 UTC

LiveData:排队或延迟或异步问题[关闭]

  • -1
关闭 这个问题是题外话。目前不接受回复。

寻求调试帮助的问题(“为什么这段代码不起作用? ”)应该包括期望的行为、具体的问题或错误,以及在问题中重现它的最少代码。没有明确描述问题的问题对其他访问者毫无用处。请参阅如何创建一个最小的、独立的和可重现的示例。

1 年前关闭。

改进问题

我有一个奇怪的错误,我无法弄清楚问题是什么。
代码的要点:
我有 2 LiveData。
1 - 来自互联网的数据。要么他们是,要么他们是null。
2 -Boolean工作状态。真实 - 在工作开始时。false- 成功完成后。null——如果资料太来自网上null。

 suspend fun getGms(platform: String, nickName: String) = withContext(Dispatchers.Default) { 
        loadFlag.postValue(true) 
        
        gmsInet.postValue(getGmsFromInet(platform, nickName)) 
 
        if (loadFlag.value != null) loadFlag.postValue(false) 
 
    } 
 
 private suspend fun getGmsFromInet(platform: String, nickName: String): _GamerStats? = withContext(Dispatchers.IO) { 
        val ret: _GamerStats? = remoteModel.getGmsFromInet(platform, nickName) 
        if (ret == null) loadFlag.postValue(null) 
        return@withContext ret 
} 

问题出在这条线上, if (ret == null) loadFlag.postValue(null)
我在日志中看到它来ret了,真相来了null,但标志loadFlag没有改变。它变成false.
如果我至少延迟1 мс- 那么一切都会正常进行。

 if (ret == null) loadFlag.postValue(null) 
  delay(1) 
  return@withContext ret 

与不同的调度员一起玩 - 没有区别。
就好像该行loadFlag.postValue(null)与其余行异步执行一样。
无法弄清楚我的错误在哪里或我错过了什么

java
  • 1 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2022-07-19 19:11:11 +0000 UTC

电话室窃听[关闭]

  • 1
关闭。这个问题需要澄清或补充细节。目前不接受回复。

想改进这个问题?通过编辑此帖子添加更多详细信息并澄清问题。

1 年前关闭。

改进问题

我改变了类结构中的一些东西。当然,房间开始发誓“现有的数据库结构与新的不匹配”。
从手机中删除应用程序。重新启动。清除项目缓存。重建 Gradle。
一切都无济于事。
在模拟器上一切正常。只需卸载该应用程序,一切正常。
但在真正的手机上它没有帮助。
三星 Galaxy A12
还需要做什么才能从手机中完全删除应用程序?

android
  • 1 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2022-07-11 20:19:45 +0000 UTC

房间:嵌入式和列表

  • 1

请帮我弄清楚如何在 Room 中工作,List<MyClass>
我有一个大型 JSON,分为 30 多个嵌套类。
我从互联网收集数据。一切都很完美。

我正在尝试将此数据写入 Room。
为了将嵌套类写入数据库,我在它们上使用注释@Embedded

但在某些类中,我的参数不仅来自类实例,还来自数组

@SerializedName("availableSegments") 
var availableSegments: List<AvailableSegment>

如果我尝试挂@Embedded在这样的参数上,它会给出一个错误

Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).   

类本身AvailableSegment包含其他“自定义”参数(不是原始 String、Int 等)。

更新!!!有条件...
我有 3 节课:

@Entity(tableName = "car_table")
data class Car(
        @Embedded var zerka: Zerkala,
        @Embedded var side: Sidenia,
        @PrimaryKey(autoGenerate = true) var primKey: Int = 0
)


data class Zerkala(
        var kolvo: Int
)


data class Sidenia(
        var color: String
) 

像这样 - 一切正常。
但是如果在主类中我将任何参数更改为数组:

@Entity(tableName = "car_table")
data class Car(
        @Embedded var zerka: Zerkala,
        @Embedded var side: List<Sidenia>,
        @PrimaryKey(autoGenerate = true) var primKey: Int = 0
)

没有任何作用...

Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.ListD:\Program\AndroidProject\TesListRoom\app\build\tmp\kapt3\stubs\debug\by\wlad\koshelev\teslistroom\CarDataBaase.java:7: warning: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide `room.schemaLocation` annotation processor argument OR set exportSchema to false.
java
  • 1 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2022-04-20 15:36:06 +0000 UTC

在 ArrayList 中重复而不迭代

  • 0

有这样一个任务:
编写一个在 ArrayList 中查找重复对象的方法,而不使用逐个元素的枚举。

不要让我为我解决问题。我请你提出一个在哪个方向挖掘的想法。
使用逐元素枚举 - 很容易完成。但怎么没有?

java
  • 3 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2022-04-13 13:47:09 +0000 UTC

新版 Android Studio 和 Gradle 上的旧项目

  • 0

几年前有一个旧项目。因此,Android Studio 和 Gradle 也属于那个时代。
现在一切都很新鲜。
该项目由“导出到 Zip”保存。
现在(一切都是新鲜的),当你打开项目时,它开始下载旧的 Gradle。
如何导入项目但已经在新的 Gradle 上?

android
  • 1 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2022-01-29 20:44:41 +0000 UTC

媒体播放器:Android 10 错误

  • 0

从 API 28 切换到 29。
有一个代码可以从手机播放随机音乐。

mus.setDataSource(songsList.get(rnd.nextInt(songsList.size())));
mus.prepare();
mus.start();

28日一切正常,29日没有任何反应。
这只发生在 Android 10 上的真实(3 台)和虚拟手机(在低版本上一切正常)。
我在日志中看不到任何错误。

一个有趣且重要的事实:
如果您从头开始安装应用程序,则会出现错误。如果它已经设置为 API 28 并将其更新为 29 - 一切都会正常工作。

我不会在任何地方保存任何东西,我不会缓存任何东西。只有当我点击按钮时,我才会得到歌曲列表。
允许阅读 - 我在日志中看到完整的歌曲列表。
歌曲路径没有区别(Path和都试过了Uri)

java
  • 1 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2020-10-06 00:13:52 +0000 UTC

以编程方式将操作系统设置为应用程序或 WebView

  • 2

有 * js 脚本可以找出客户端正在使用的操作系统(windows、mac、android 等)
是否有可能以某种方式为 Android 中的 WebView 设置(读作“作弊”)此类脚本所需的操作系统?
要说应用本身或者WebView本身用的不是Android,而是Windows或者iPhone?

android
  • 1 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2020-03-25 21:17:58 +0000 UTC

传单和鼠标滚轮:Zoom 的步骤

  • 1

图书馆里有一张地图Leaflet.js
,鼠标滚轮默认放大或缩小2倍。
该库中将修复的方法的名称是2什么1?

leafletjs
  • 1 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2020-01-24 17:52:54 +0000 UTC

通知不显示图片

  • 0

通知通知不会拉出所有手机上的图片。我使用
.setSmallIcon(R.mipmap.ic_launcher)
它,它适用于大多数手机。但是在一部手机和模拟器中没有 - 只有一个白色圆圈。
我尝试从drawable. 图标的形状发生了变化 - 但里面仍然是白色的。

怎么了?有具体的尺寸吗?

更新:

在这些手机上,结果显示矢量图像。但是如何处理光栅呢?
有些手机被接受.setSmallIcon()为光栅,而另一些则不是?

在此处输入图像描述

java
  • 1 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2020-01-21 02:20:55 +0000 UTC

RECEIVE_BOOT_COMPLETED - 设备上的不同行为

  • 1

重启手机后应该启动一项服务。为此,我制作了一个接收器,并在 Manifesto(我发现)中给了它必要的条件。

有 3 部手机,它们都有完全不同的行为。

红米手机 4x 安卓 7.1.2。只是不想工作。

联想 K5 笔记。安卓 5.1。此处服务在重新启动后启动,仅当服务在重新启动之前运行时

三星 Galaxy S5 安卓 6.0.1。这里一切似乎都很好。没有区别“服务是否在此之前启动?没有?”。重新启动后,服务将启动。

我的接收者

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent intentService = new Intent(context, MusicServ.class);
        context.startService(intentService);
    }
}

宣言

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<service
    android:name=".MusicServ"
    android:enabled="true"
    android:exported="true"
    android:process=":MusicServ">

</service>

<receiver
    android:name=".MyReceiver"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
    android:enabled="true">

    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <action android:name="android.intent.action.REBOOT"/>
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</receiver>
java
  • 2 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2020-01-14 18:50:04 +0000 UTC

MediaPlayer via URI - 从外部存储器播放

  • 0

音频文件存储在手机中。我想重现它。用户选择文件后,我正在获取文件的 URI

uri.getPath();节目

/TREE/PRIMATY:VLAD/1.mp3或者/DOCUMENT/PRIMATY:VLAD/1.mp3

如何在 MediaPlayer 中播放此文件?如何指定路径?

java
  • 1 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2020-01-13 19:46:33 +0000 UTC

指定文件夹路径

  • 1

用户必须通过可视文件管理器指定包含文件的文件夹的路径。找到以下代码。但这里不是文件夹,而是文件。是的,我不明白路径本身记录在哪里。

任何人都可以提出其他解决方案。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");      //all files
// intent.setType("text/xml");   //XML file only
intent.addCategory(Intent.CATEGORY_OPENABLE);

try {
    startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), a);
} catch (android.content.ActivityNotFoundException ex) {
    // Potentially direct the user to the Market with a Dialog
    Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}

向上!

实现了选择文件并获取其路径。但我仍然无法选择文件夹。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");      //all files
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), REQUEST_CODE);
    } catch (android.content.ActivityNotFoundException ex) {
        // Potentially direct the user to the Market with a Dialog
        Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        Uri uri = data.getData();
        Toast.makeText(this, uri+"", Toast.LENGTH_SHORT).show();
    }
}
java
  • 2 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2020-11-27 16:28:34 +0000 UTC

“静态最终”与“最终”有什么区别?

  • -1

static final和final。

常数的两个值都不会改变。

有什么区别?

java
  • 3 个回答
  • 10 Views
Martin Hope
Wlad
Asked: 2020-09-26 19:14:29 +0000 UTC

生成签名的 apk 时出错

  • 0
Lint found fatal errors while assembling a release target.

To proceed, either fix the issues identified by lint, or modify your build script as follows:
...
android {
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}
...

如果我遵循建议,那么将创建所有 apk。但是这个错误是什么?因为什么?可能有什么后果?

java
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5