不在 androidX 库中的 BottomSheetBehavior

我使用的是 BottomSheetBehavior和最初的支持库:

implementation 'com.android.support:design:27.1.1'

当我迁移到使用新的 androidx库时,虽然缺少 BottomSheetBehavior。来自上面支持库的映射也不在 AndroidX 重构列表中,但是迁移工具删除了它。

在新的 androidx库中包含 BottomSheetBehavior 时,我遗漏了什么。

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.android.material:material:1.0.0-beta01'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"


// ReactiveX
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'


implementation 'com.android.support:design:28.1.0'


// Android Compatability Libraries
// Version: https://developer.android.com/topic/libraries/support-library/refactor
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0-beta01'
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-beta01'
implementation 'androidx.recyclerview:recyclerview:1.0.0-beta01'


// Android Navigation Component
// Check here for updated version info - will move to androidx soon.
// https://developer.android.com/topic/libraries/architecture/adding-components
def nav_version = "1.0.0-alpha04"


// use -ktx for Kotlin
implementation "android.arch.navigation:navigation-fragment-ktx:$nav_version"
implementation "android.arch.navigation:navigation-ui-ktx:$nav_version"
androidTestImplementation "android.arch.navigation:navigation-testing-ktx:$nav_version"


// Testing
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
}
45100 次浏览

It turns out that the refactor tool in Android Studio Refactor > Migrate to AndroidX didn't correctly migrate the XML for the BottomSheetBehaviour.

The old location was android.support.design.widget.BottomSheetBehavior, and was not modified by the migration tool. The original XML was:

<fragment
android:id="@+id/player_bottom_sheet_fragment"
android:name="app.rxsongbrowsertrials.ui.player.PlayerToggleFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:behavior_hideable="false"
app:behavior_peekHeight="56dp"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
/>

The new location is com.google.android.material.bottomsheet.BottomSheetBehavior, so the layout needs to become:

<fragment
android:id="@+id/player_bottom_sheet_fragment"
android:name="app.rxsongbrowsertrials.ui.player.PlayerToggleFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:behavior_hideable="false"
app:behavior_peekHeight="56dp"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
/>

You could also replace

    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
or
app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

by

app:layout_behavior="@string/bottom_sheet_behavior"

You have to import the Material Components Library provided by Google.

Material Components for Android is a drop-in replacement for Android's Design Support Library.

Add in your build.gradle:

implementation 'com.google.android.material:material:x.x.x'

Then use the class com.google.android.material.bottomsheet.BottomSheetBehavior.

In your layout you can use the attribute:

    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
..>

or

app:layout_behavior="@string/bottom_sheet_behavior"

I got this error message:

Didn't find class "com.google.android.material.bottomsheet.BottomSheetBehaviour"

The only way to solve this was to change the XML:

Change:


app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"


Change to:


app:layout_behavior="@string/bottom_sheet_behavior"

This solved the problem

For R class

com.google.android.material.R.id.design_bottom_sheet

instead of

android.support.design.R.id.design_bottom_sheet