小编Muh*_*lib的帖子

如何在 ViewPager2 中按标签获取 Fragment

有人告诉我使用 FragmentStateAdapter 的 createFragment 覆盖来按索引获取当前片段。

这就是我的适配器的样子。

class AddRestaurantPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
    FragmentStateAdapter(fragmentManager, lifecycle) {
    private var fragments = listOf<Fragment>(
        FragmentA.newInstance(),
        FragmentB.newInstance(),
        FragmentC.newInstance(),
        FragmentD.newInstance()
    )

    override fun getItemCount() = 4
    override fun createFragment(position: Int) =
        fragments[position]

}
Run Code Online (Sandbox Code Playgroud)

这工作正常,直到我们在此活动/片段上强制使用 onSaveInstance/OnRestoreInstance。

ViewPager2 重新加载已经存在的片段,我们需要一种方法来访问它。FragmentStateAdapter 类中的以下 LOC 证明了这一点

private void ensureFragment(int position) {
        long itemId = getItemId(position);
        if (!mFragments.containsKey(itemId)) {
            // TODO(133419201): check if a Fragment provided here is a new Fragment
            Fragment newFragment = createFragment(position);
            newFragment.setInitialSavedState(mSavedStates.get(itemId));
            mFragments.put(itemId, newFragment);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在 activity/fragment recreation …

android android-viewpager2

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

如何给盒子一个圆形描边?

这就是我最终给我的jetpack Compose盒子一个圆角形状的方式

Box(modifier = Modifier
    .size(32.dp)
    .clip(CircleShape)
    .border(BorderStroke(2.dp, Color.Red), CircleShape)
    ){

  }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,CircleShape 在修改器链中被提及两次。感觉好像必须有更好的方法来做到这一点。

有任何想法吗?

android android-jetpack-compose jetpack-compose-modifier

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

通过 Kotlin 注解限制参数值

我正在测试 Kotlin 注释,但无法让这段看似简单的代码正常工作

这是我的简单注释

@IntDef(1,2)
@Target(
    AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class OnlyOneTwo
Run Code Online (Sandbox Code Playgroud)

现在我假设如果我用 装饰一个值参数@OnlyOneTwo,如果我给它一个像 那样的值,该方法会引发编译错误5

我像这样使用这个注释

fun onlyTakesOneTwos(@OnlyOneTwo input:Int){

}
onlyTakesOneTwos(6) // shouldn't this throw a compile error ?
Run Code Online (Sandbox Code Playgroud)

我记得在Java中它曾经抛出一个错误。

java android kotlin

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

如何在JNI中实例化一个类

我很惊讶这个非常重要的细节缺少在互联网上的全面演练.或者也许我是一个最糟糕的Google员工.或者是一个完全愚蠢的程序员.

我几个月来一直在研究android,但最近我被告知要做JNI.我的C技能已经生锈了.然而,当我坚持这一点并且无法继续前进时,我正赶上来.

我想要简单的东西.这是我在MainActivity中的原生方法声明

public native Object createObject();

这就是我打算如何使用它

    Object abc = createObject();
    Integer num = (Integer) abc;
Run Code Online (Sandbox Code Playgroud)

我只想从C创建一个java.lang.Integer对象,并将其发送给java.它不能变得更简单

    jobject Java_com_example_hellojni_HelloJni_callbackJava(JNIEnv * env, jobject this )
{
    jclass cls = (*env)->FindClass(env, "java/lang/Integer");
    jmethodID methodID = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
    jint number = 8 ; 
    return (*env)->NewObject(cls, methodID, number);

}
Run Code Online (Sandbox Code Playgroud)

(android ndk r8c)我受到堆栈跟踪的欢迎,这会导致我的应用程序崩溃.

12-14 16:10:07.595: D/dalvikvm(302): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x45f3da60
12-14 16:10:07.625: D/dalvikvm(302): Added shared lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x45f3da60
12-14 16:10:07.625: D/dalvikvm(302): No JNI_OnLoad found in /data/data/com.example.hellojni/lib/libhello-jni.so 0x45f3da60, skipping init

12-14 …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface android android-ndk

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

colorButtonNormal没有效果?

我正在尝试在我的按钮上应用统一的样式。

这是我的 v21/styles.xml

<style name="DefaultButton" parent="Widget.AppCompat.Button.Colored">
    <item name="android:colorButtonNormal">#f00</item>
    <item name="android:textColor">@color/colorTextSecondary</item>
</style>
Run Code Online (Sandbox Code Playgroud)

我像这样将其应用到我的按钮上

<Button
                android:id="@+id/submit_btn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginTop="@dimen/unit_large"
                style="@style/DefaultButton"
                android:text="Lemme In!" />
Run Code Online (Sandbox Code Playgroud)

这里没有什么特别的事情发生。但我的按钮的颜色没有改变。物质支持包有什么变化吗?我正在使用“25.3.1”

实际上,所有这些都是我必须做的更大努力的一部分,以更改应用程序的默认按钮样式,如下所示

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

    <item name="android:buttonStyle">@style/DefaultButton</item>
</style>
Run Code Online (Sandbox Code Playgroud)

然后我将删除所有按钮上的单独样式属性

android android-appcompat android-6.0-marshmallow

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

房间可流动多次调用

我的 TeamDao 中有这个

@Query("select * from teams where id = :teamId")
    Flowable<Team> getRivals(int teamId);
Run Code Online (Sandbox Code Playgroud)

我像这样订阅这个

teamRepository.getRivals(61).
                distinctUntilChanged().
                observeOn(SchedulerProvider.getInstance().ui()).

                subscribeOn(SchedulerProvider.getInstance().computation())
                .subscribe(team -> Log.d("HomeActivity", team.getName()));
Run Code Online (Sandbox Code Playgroud)

每当 Team 表的任何行发生任何更改时,无论它是否带有 id 61 ,我都会看到我的 this 订阅者正在调用。

我在博客上读到 distinctUntilChanged() 正是用来避免这种情况的。

我的团队POJO是这样的

@Entity(tableName = "teams",
        foreignKeys = {
                @ForeignKey
                        (entity = User.class,
                                parentColumns = "id",
                                childColumns = "userId",
                                onDelete = ForeignKey.CASCADE),
                @ForeignKey
                        (entity = Neighbourhood.class,
                                parentColumns = "id",
                                childColumns = "neighbourhoodId"
                        )})
public class Team {

    @PrimaryKey
    int id;
    private String name;
    private String imageUrl;

    @Embedded(prefix = …
Run Code Online (Sandbox Code Playgroud)

android rx-android rx-java2 android-room

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

XML布局在android studio中不会换行

更新了android studio之后,布局编辑器中的XML格式被破坏了。最初,每个属性都位于单独的行上。但是,现在有两个或三个属性排成一行。

在此处输入图片说明

我进入“设置”->“编辑器”->“代码样式”->“ XML”,然后在“布局文件”区域下将“包裹属性”设置为“总是包裹”,并选中“先插入后换行”属性。

但是效果没有出现。

有指针吗?

设定画面

android-studio

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

Firebase 异步任务到协程

我使用挂起例程构建器使 Firebase 任务从基于异步侦听器的代码转移到基于协程的代码。

这是我的 suspendcoroutine,通过它我实现了协程行为。

suspend fun <T> Task<T>.awaitTask(): T =
    suspendCoroutine { continuation ->
        addOnCompleteListener { task ->
            if (task.isSuccessful) {
                continuation.resume(task.result!!)//what to do if task.result is null
            } else {
                continuation.resumeWithException(task.exception!!)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这就是我调用它的方式

firebase.createUserWithEmailAndPassword(userCredentials.email!!, userCredentials.password!!).awaitTask()
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我们执行一个可能为空结果的任务。喜欢 。

firebase.currentUser?.updateProfile(profileUpdates)?.awaitTask()
Run Code Online (Sandbox Code Playgroud)

这里在成功更新后,task.result 为空。在那种情况下,应该将什么传递给 continuation.resume?。

android kotlin firebase-authentication kotlin-coroutines

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

C#Linq-to-Entities OrderByDescending无效

这是我的实体SportTeam:

public class SportTeam : BaseEntity
{
    public int Id { get; set; } 
    public int SportId { get; set; }
    public int TeamId { get; set; }

    public int TotalPlays { get; set; }
    public int TotalWins { get; set; }
    public int TotalDefeats { get; set; }
    public int TotalDraws { get; set; }
    public float WinPercentage { get; set; }
    public float Score { get; set; }

    // navs
    public virtual Ladder Ladder { get; …
Run Code Online (Sandbox Code Playgroud)

c# linq sql-server entity-framework-6

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

通过视图模型在片段之间共享数据

根据https://developer.android.com/topic/libraries/architecture/viewmodel 上的“片段之间共享数据”部分,我们被告知在活动范围内创建一个 ViewModel 并在片段之间共享是要走的路.

这是在 ViewModel 中设置值的 Fragment

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是使用属性集的细节片段

class DetailFragment : Fragment() {

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        model.selected.observe(this, …
Run Code Online (Sandbox Code Playgroud)

android android-viewmodel android-jetpack

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