小编Raj*_*shi的帖子

如何使用新的androidx.lifecycle:*:2.2.0-alpha01获取lifecycle.coroutineScope

2019年5月7日androidx.lifecycle:*:2.2.0-alpha01发布,宣布:

此版本添加了新功能,增加了对Lifecycle和LiveData的Kotlin协程的支持。可以在此处找到有关它们的详细文档。

文档中提到我可以得到LifecycleScope

通过lifecycle.coroutineScopelifecycleOwner.lifecycleScope属性

但似乎我找不到它们。我目前的依赖是:

def lifecycle_ver = "2.2.0-alpha01"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_ver"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_ver"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_ver"

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1'
Run Code Online (Sandbox Code Playgroud)

可能是什么原因以及如何获得这些API?

android android-architecture-components android-jetpack

12
推荐指数
2
解决办法
761
查看次数

如何使用导航架构组件在应用栏中设置标题

我正在尝试导航架构组件,但现在在设置标题时遇到了困难。如何以编程方式设置标题以及其工作方式?

为了澄清我的问题,让我们举个例子,在这里,我建立了一个简单的应用程序,用于MainActivity托管导航主机控制器,该应用程序MainFragment有一个按钮,然后单击该按钮转到DetailFragment

来自另一个问题的相同代码,该问题涉及堆栈溢出的多个应用栏

主要活动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Setting up a back button
        NavController navController = Navigation.findNavController(this, R.id.nav_host);
        NavigationUI.setupActionBarWithNavController(this, navController);
    }

    @Override
    public boolean onSupportNavigateUp() {
        return Navigation.findNavController(this, R.id.nav_host).navigateUp();
    }
}
Run Code Online (Sandbox Code Playgroud)

主片段

public class MainFragment extends Fragment {

    public MainFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-architecture-navigation androidx

10
推荐指数
8
解决办法
9060
查看次数

顶部应用栏和底部应用栏的两个不同菜单,带有导航组件

我正在尝试Android 导航架构组件,并且还在研究材料设计指南.我真的受到以下设计的启发:

顶部和底部的应用栏

对于顶部工具栏,我可以设置它setSupportActionBar(toolbar),然后在MainActivity:

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

但是在尝试时我无法弄清楚如何在顶部和底部应用栏上为不同的片段实现菜单,特别是对于底部应用栏.

例如,我想在底部应用栏上显示一个喜欢的图标DetailFragment,但是MainActivity,它应该消失了.

我目前的代码:

主要活动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        NavController navController = Navigation.findNavController(this, R.id.nav_host);
        NavigationUI.setupActionBarWithNavController(this, navController);


        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show());


    }

    @Override
    public boolean onSupportNavigateUp() …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-jetpack android-bottomappbar androidx

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

TextInputLayout错误:无法解析资源@ string/path_password_strike_through

AndroidX:我正在尝试使用TextInputLayout但是当我把它放在我的XML中时,我收到此错误:

渲染问题:

Couldn't resolve resource @string/path_password_strike_through
Run Code Online (Sandbox Code Playgroud)

无法启动一个或多个课程

The following classes could not be instantiated:
        com.google.android.material.textfield.TextInputLayout
Run Code Online (Sandbox Code Playgroud)

这里的堆栈跟踪:

java.lang.AssertionError: error in parsing "g/"java.lang.NumberFormatException: For input string: "/"
    at android.util.PathParser_Delegate.getFloats(PathParser_Delegate.java:366)
    at android.util.PathParser_Delegate.createNodesFromPathData(PathParser_Delegate.java:183)
    at android.util.PathParser_Delegate.nCreatePathDataFromString(PathParser_Delegate.java:107)
    at android.util.PathParser.nCreatePathDataFromString(PathParser.java)
    at android.util.PathParser.access$200(PathParser.java:24)
    at android.util.PathParser$PathData.<init>(PathParser.java:76)
    at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:2016)
    at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1967)
    at android.graphics.drawable.VectorDrawable.inflateChildElements(VectorDrawable.java:819)
    at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:717)
    at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142)
    at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332)
    at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291)
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1266)
    at com.android.layoutlib.bridge.impl.ResourceHelper.getDrawable(ResourceHelper.java:330)
    at android.content.res.Resources_Delegate.getDrawable(Resources_Delegate.java:186)
    at android.content.res.Resources.getDrawable(Resources.java:827)
    at android.graphics.drawable.AnimatedVectorDrawable.inflate(AnimatedVectorDrawable.java:544)
    at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142)
    at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332)
    at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291)
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1266)
    at com.android.layoutlib.bridge.impl.ResourceHelper.getDrawable(ResourceHelper.java:330)
    at android.content.res.BridgeTypedArray.getDrawable(BridgeTypedArray.java:684)
    at android.graphics.drawable.AnimatedStateListDrawable.parseTransition(AnimatedStateListDrawable.java:473)
    at android.graphics.drawable.AnimatedStateListDrawable.inflateChildElements(AnimatedStateListDrawable.java:455)
    at android.graphics.drawable.AnimatedStateListDrawable.inflate(AnimatedStateListDrawable.java:385)
    at …
Run Code Online (Sandbox Code Playgroud)

android exception android-layout androidx

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

找不到 Firestore Android 的 whereArrayContains() 方法

以前我问一个关于数据模型的问题在那里我得到了如何使用数组一个有用的链接在这里

但正如 Frank van Puffelen (@FrankvanPuffelen) 所说,在评论中,它会改变,它改变了,并且有一个新的文档

但现在我找不到方法whereArrayContains(),例如:

CollectionReference messageRef = mFirestoreDb.collection("messages");
Query query = messageRef.whereArrayContains("...", "..."); //?
Run Code Online (Sandbox Code Playgroud)

至于依赖项,在我写这个问题时,它是最新的设置你的开发环境

implementation 'com.google.firebase:firebase-firestore:17.0.4'
Run Code Online (Sandbox Code Playgroud)

我在这里做错了吗?

android firebase google-cloud-firestore

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

如何使用导航架构组件在另一个活动上显示向上按钮

假设我在ActivityA有一个 Fab 按钮的父级上。单击 Fab 按钮后,它会打开ActivityB.

ActivityB包含导航图。所以我已经设置了导航组件,如:

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null)
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph())
        .build();
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我无法显示向上按钮以转到父活动。上AndroidManifext.xml,代码是:

<activity
    android:name=".ui.ActivityB"
    android:label="Activity B"
    android:launchMode="singleTop"
    android:parentActivityName=".ui.ActivityA">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.ui.ActivityA" />
</activity>
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是如何显示向上按钮?


@ianhanniballake,上面的一个正在处理你的答案,但不是这个:

Toolbar toolbar = findViewById(R.id.toolbar);

NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder()
        .build();
NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration);
Run Code Online (Sandbox Code Playgroud)

或者:

NavigationUI.setupWithNavController(toolbar, navController);
Run Code Online (Sandbox Code Playgroud)

android android-jetpack android-architecture-navigation

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

如何在放置在底部应用栏上的 FloatingActionBar (fab) 上方显示 Snackbar(材料设计)

我正在尝试新材料底部应用栏。在设计指南中,它被告知“在底部应用程序栏和 FAB 上方插入小吃店或吐司”,但我不确定如何去做。谁能帮我。以下是我正在使用的代码:

主要活动

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show());
}
Run Code Online (Sandbox Code Playgroud)

活动_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </com.google.android.material.appbar.AppBarLayout>

    <include layout="@layout/content_main" />

    <com.google.android.material.bottomappbar.BottomAppBar
        style="@style/Widget.MaterialComponents.BottomAppBar"
        android:id="@+id/bar"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_gravity="bottom"
        android:backgroundTint="@color/colorAccent"
        app:fabAlignmentMode="end" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@android:drawable/ic_dialog_email"
        app:layout_anchor="@id/bar"
        app:layout_anchorGravity="bottom" />

</androidx.coordinatorlayout.widget.CoordinatorLayout> …
Run Code Online (Sandbox Code Playgroud)

android android-layout material-design

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

Firestore 使用身份验证名称为特定用户编写安全规则

Firestore 安全规则不熟悉,正在尝试了解它。我正在尝试编写一项安全规则,仅允许admins在我的集合中写入数据,而每个人都可以读取数据。

具有文档 ID 作为管理员名称的集合admins,例如“Mary Lane”。在文档中我有字段:

email: "userMailId@mail.com"
uId: "firestore_user_Id"
Run Code Online (Sandbox Code Playgroud)

uId是 Firestore 用户 ID。要写入的数据是一个对象,Message并且是:

new Message(uId, title, messageBody, timestamp)
Run Code Online (Sandbox Code Playgroud)

目前我正在尝试将与存储在集合中request.auth.uid的 id进行匹配:admins

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if request.auth.uid == resource.data.uId;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是写的还是我做错了什么。任何帮助表示赞赏。

firebase firebase-security google-cloud-firestore

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

如果不存在安全规则,Firestore 将创建文档

我试图编写一个规则,如果文档的 id 不存在,则创建一个新文档。我的目标是:

\n\n
Message message = new Message(userId, title, messageBody, timestamp);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在WriteBatch创建一个新文档并更新它:

\n\n
mWriteBatch.set(mMessageRef.document(messageId), message);\n\nmWriteBatch.update(mMessageRef.document(mIntentMessageId), // params...);\n
Run Code Online (Sandbox Code Playgroud)\n\n

浏览文档和此站点后,我发现如果我使用create方法,它只允许在数据不存在时写入数据

\n\n

所以我创建了一个安全规则,例如:

\n\n
match /messages/{message} {\n  allow read; \n  allow create: if isSignedIn();\n  allow update, delete: if isSignedIn();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

isSignedIn()只是一个方法 contianing request.auth != null。此规则失败并覆盖数据。现在我尝试了:

\n\n
match /messages/{message} {\n  allow read; \n  allow create: if request.resource.id != message;\n  allow update, delete: if isSignedIn();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这次它也覆盖了数据而不是显示错误。

\n\n

我在这里做错了什么?任何帮助表示赞赏。

\n\n

更新:正如 Jos\xc3\xa9 David Aroesti …

firebase firebase-security google-cloud-firestore

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

具有新依赖项的Firestore崩溃应用

昨天,我使用来更新Firestore 17.1.1和Google Services 的依赖关系4.1.0。现在启动应用程序时会崩溃。

注意:

如果我将Google Services更改为4.0.2,则Firestore会正确初始化,并且该应用程序将按预期运行。

classpath 'com.google.gms:google-services:4.0.2'
Run Code Online (Sandbox Code Playgroud)

更新:

转变为4.2.0作品。


日志:

Default FirebaseApp failed to initialize because no default options were found. This usually means that com.google.gms:google-services was not applied to your gradle project.
... I/FirebaseInitProvider: FirebaseApp initialization unsuccessful
Run Code Online (Sandbox Code Playgroud)

错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{\...\/\...\.ui.MessageActivity}: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process \...\. Make sure to call FirebaseApp.initializeApp(Context) first.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at …
Run Code Online (Sandbox Code Playgroud)

android firebase google-cloud-firestore

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