小编Mos*_*ius的帖子

Android MVVM:适配器放在哪里?

我正在构建一个遵循MVVM架构的Android应用程序.适配器(对于recyclerview,viewpager等)属于哪里?它是View还是ViewModel?

android mvvm

18
推荐指数
3
解决办法
5526
查看次数

为什么Kotlin修饰符'open'与'data'不兼容?

我上课了

open data class Person(var name: String)
Run Code Online (Sandbox Code Playgroud)

和另一堂课

data class Student(var reg: String) : Person("")
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误

错误:修饰符'open'与'data'不兼容

如果我从Person类中删除数据的罚款.

为什么kotlin打开和数据不兼容?

inheritance class kotlin

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

Stage.enter无法启动向导

我创建了一个向用户显示调查向导的应用程序。当用户启动/ start命令时,我将调用AddProject

const Telegraf = require('telegraf');
const bot = new Telegraf(process.env.BOT_TOKEN);
const session = require('telegraf/session');
bot.use(session());

const main = new TelegrafInlineMenu("Welcome.");
main.setCommand('start');
main.simpleButton('Start Survey', 'START_SURVEY', {
  doFunc: async ctx => surveyController.AddProject(ctx, bot)
});
Run Code Online (Sandbox Code Playgroud)

基本上,以上代码创建了一个菜单,其中显示了标签Welcome(欢迎)和一个按钮以启动调查。当用户单击按钮时,从SurveyController调用方法AddProject:

const Composer = require('telegraf/composer');
const stepHandler = new Composer();
const Stage = require('telegraf/stage');
const WizardScene = require('telegraf/scenes/wizard');
const userController = require('../controllers/user.controller');

module.exports = {

  AddProject: async function (ctx, bot) {

    const superWizard = new WizardScene('super-wizard',
      (ctx) => {
        ctx.reply('Step 1', Markup.inlineKeyboard([
          Markup.urlButton('??', 'http://telegraf.js.org'),
          Markup.callbackButton('?? …
Run Code Online (Sandbox Code Playgroud)

javascript node.js telegram telegram-bot telegraf

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

Java BigDecimal与Android BigDecimal

我面对java.math.BigDecimal并且android.icu.math.BigDecimal正如我BigDecimal在项目中所要求的那样.

我意识到Android BigDecimal需要API级别24

这两个班级有什么不同?我想知道Android实现中是否有任何性能优化?

java android bigdecimal

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

为什么要将val或var放在kotlin类构造函数中

刚刚学习Kotlin在下面的第一个代码val中,其他代码中没有关键字,没有,如果valvar被省略,这里有什么不同?

class Person(val firstName: String, val lastName: String) {
}

class Person(firstName: String, lastName: String) {
}
Run Code Online (Sandbox Code Playgroud)

in-class-initialization kotlin

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

无法创建ViewModel类的实例kotlin

这是我的代码

class BookmarkViewModel(app: Application) : AndroidViewModel(app) {

    private val dao = BookmarkDb.get(app).bookmarkDao()

    companion object {
        private const val PAGE_SIZE = PagingConstants.PERPAGE

        /**
         * If placeholders are enabled, PagedList will report the full size but some items might
         * be null in onBind method (PagedListAdapter triggers a rebind when data is loaded).
         * <p>
         * If placeholders are disabled, onBind will never receive null but as more pages are
         * loaded, the scrollbars will jitter as new pages are loaded. You …
Run Code Online (Sandbox Code Playgroud)

android kotlin

4
推荐指数
2
解决办法
6072
查看次数

Android:使用 Room 和 RxJava 检查数据库中是否存在对象

我正在Room用作 ORM,这是我的 Dao 界面:

@Dao
interface UserDao {
    @Query(value = "SELECT * FROM User LIMIT 1")
    fun get(): Single<User?>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun add(profile: User)
}
Run Code Online (Sandbox Code Playgroud)

另一方面,我在 Repository 中有一个方法可以检查用户是否登录,这是实现代码:

override fun isUserLogin(): Single<Boolean> = userDao
            .get().async()
            .onErrorReturn { null }
            .map { it != null }
Run Code Online (Sandbox Code Playgroud)

如果没有行匹配查询,Room 将抛出以下异常:

查询返回空结果集:SELECT * FROM User LIMIT 1

我想null在这种情况下返回,但是当我执行代码时,它会抛出一个异常并显示以下消息:

提供的值为空

我不能使用Optional因为 Dao 正在返回Single<User?>所以onErrorReturn应该返回相同的类型。

如何在不更改 Dao 的情况下检查用户是否存在?

android kotlin rx-java android-room

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

如何使用相同的参数类型重载函数但其中一个可以为空

我正在尝试向CalendarAndroid中的Class 添加两个扩展功能,以将特定的日期时间模式转换为Calendar,反之亦然

fun Calendar.fromIsoString(date: String): Calendar = this.apply {
    time = SimpleDateFormat(SERVER_DATE_PATTERN, Locale.US).parse(date)
}

fun Calendar.fromIsoString(date: String?): Calendar? {
    if (date == null) return null
    time = SimpleDateFormat(SERVER_DATE_PATTERN, Locale.US).parse(date)
    return this
}
Run Code Online (Sandbox Code Playgroud)

但这给了我以下错误:

平台声明冲突:以下声明具有相同的JVM签名(fromIsoString(Ljava / util / Calendar; Ljava / lang / String;)Ljava / util / Calendar;)

是否可以同时具有这两个功能?怎么样?

注意:我通过向Unit其中一个功能添加可选参数来解决该问题:

fun Calendar.fromIsoString(date: String?, a: Unit = Unit): Calendar? {
if (date == null) return null
    time = SimpleDateFormat(SERVER_DATE_PATTERN, Locale.US).parse(date)
    return this
}
Run Code Online (Sandbox Code Playgroud)

但是我认为这很棘手,不是一个好习惯!有更好的解决方案吗?

kotlin

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

仅将标记为已归类的类型传递给Kotlin泛型函数

假设我有以下代码:

open class Fruit
class Apple : Fruit()
open class Juice<T : Fruit>
class AppleJuice : Juice<Apple>()

fun <F : Fruit, J : Juice<F>> makeJuice(juiceClass : Class<J>, fruit : F) : J {}
Run Code Online (Sandbox Code Playgroud)

我这样调用该函数:

val appleJuice : AppleJuice = makeJuice(AppleJuice::class.java, Apple())
Run Code Online (Sandbox Code Playgroud)

但是,我不想传递类对象,而是希望将其AppleJuice作为类型传递:

val appleJuice : AppleJuice = makeJuice<AppleJuice>(Apple())
Run Code Online (Sandbox Code Playgroud)

我重构了我的功能以内联reified

inline fun <F : Fruit, reified J : Juice<F>> makeJuice(fruit : F) : J {}
Run Code Online (Sandbox Code Playgroud)

但是现在我必须指定两种类型:

val appleJuice : AppleJuice = makeJuice<Apple, AppleJuice>(Apple())
Run Code Online (Sandbox Code Playgroud)

从理论上讲,Apple不需要类型,因为它已经从AppleJuice …

kotlin kotlin-generics kotlin-reified-type-parameters

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

NavHostFragment 在 onDestroyView 中崩溃

我有一个Activity带有 aFragmentContainerViewBottomNavigationView设置的应用程序:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            app:defaultNavHost="true"
            app:navGraph="@navigation/splash" />

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:visibility="gone"
            app:elevation="12dp"
            app:labelVisibilityMode="unlabeled"
            app:menu="@menu/menu_bottom_nav_main" />
    </LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

当用户进入应用程序时,我需要显示一个启动页面(如果需要,还需要登录),然后将其导航到主页。所以我创建了 4 个导航图,1 个用于飞溅,3 个用于底部导航。我正在使用android 示例中的这种灭绝来设置带有 3 个图形的底部导航。这是我的MainActivity代码:

@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>(
    R.layout.activity_main,
    MainViewModel::class,
) {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (!vm.splashPassed) {
            val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
            currentNavController = MutableLiveData(navHostFragment.navController) …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin android-navigationview

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