2019年5月7日androidx.lifecycle:*:2.2.0-alpha01发布,宣布:
此版本添加了新功能,增加了对Lifecycle和LiveData的Kotlin协程的支持。可以在此处找到有关它们的详细文档。
在文档中提到我可以得到LifecycleScope:
通过
lifecycle.coroutineScope或lifecycleOwner.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?
我正在尝试导航架构组件,但现在在设置标题时遇到了困难。如何以编程方式设置标题以及其工作方式?
为了澄清我的问题,让我们举个例子,在这里,我建立了一个简单的应用程序,用于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
我正在尝试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
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) 以前我问一个关于数据模型的问题在那里我得到了如何使用数组一个有用的链接在这里。
但正如 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)
我在这里做错了吗?
假设我在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) 我正在尝试新材料底部应用栏。在设计指南中,它被告知“在底部应用程序栏和 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) 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)
这是写的还是我做错了什么。任何帮助表示赞赏。
我试图编写一个规则,如果文档的 id 不存在,则创建一个新文档。我的目标是:
\n\nMessage message = new Message(userId, title, messageBody, timestamp);\nRun Code Online (Sandbox Code Playgroud)\n\n我正在WriteBatch创建一个新文档并更新它:
mWriteBatch.set(mMessageRef.document(messageId), message);\n\nmWriteBatch.update(mMessageRef.document(mIntentMessageId), // params...);\nRun Code Online (Sandbox Code Playgroud)\n\n浏览文档和此站点后,我发现如果我使用create方法,它只允许在数据不存在时写入数据。
所以我创建了一个安全规则,例如:
\n\nmatch /messages/{message} {\n allow read; \n allow create: if isSignedIn();\n allow update, delete: if isSignedIn();\n}\nRun Code Online (Sandbox Code Playgroud)\n\nisSignedIn()只是一个方法 contianing request.auth != null。此规则失败并覆盖数据。现在我尝试了:
match /messages/{message} {\n allow read; \n allow create: if request.resource.id != message;\n allow update, delete: if isSignedIn();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这次它也覆盖了数据而不是显示错误。
\n\n我在这里做错了什么?任何帮助表示赞赏。
\n\n更新:正如 Jos\xc3\xa9 David Aroesti …
昨天,我使用来更新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 ×8
firebase ×4
androidx ×3
android-architecture-navigation ×2
android-architecture-components ×1
exception ×1