Khả năng hiển thị của Android P chỉ có thể được gọi từ cùng một nhóm thư viện


143

Tôi đang cố gắng sử dụng Android P FloatingActionButton mới là một phần của com.google.android.material.floatingactionbutton.FloatingActionButtonvà tôi nhận được cảnh báo này:

VisibilityAwareImageButton.setVisibility chỉ có thể được gọi từ cùng một nhóm thư viện (groupId = com.google.android.m vật liệu)

import com.google.android.material.floatingactionbutton.FloatingActionButton
import android.view.View

class MainActivity : AppCompatActivity() {

    lateinit var demoFab: FloatingActionButton

    override fun onCreate(savedInstanceState: Bundle?) {
        demoFab = findViewById(R.id.demoFab)
        demoFab.visibility = View.VISIBLE  // the warning is here
    }
}

nhập mô tả hình ảnh ở đây

Tôi đã thử tìm kiếm và kết quả tìm kiếm duy nhất liên quan đến việc đáp ứng các thay đổi về khả năng hiển thị của UI:

Đáp ứng với thay đổi khả năng hiển thị của UI

Tôi đã thử khám phá làm thế nào tôi có thể xem liệu có một VISIBLEgiá trị int trong com.google.android.materialgói đó không và cái duy nhất tôi tìm thấy là gì com.google.android.material.floatingactionbutton.FloatingActionButton.VISIBLE, nhưng cảnh báo vẫn còn.

Xây dựng cấp cao nhất.

buildscript {
    ext.kotlin_version = '1.2.41'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0-alpha14'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.google.gms:oss-licenses:0.9.2"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url "http://oss.sonatype.org/content/repositories/snapshots/" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Xây dựng cấp dự án.gradle

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'com.google.gms.oss.licenses.plugin'

android {
    compileSdkVersion 'android-P'
    defaultConfig {
        applicationId "com.codeforsanjose.maps.pacmap"
        minSdkVersion 21
        targetSdkVersion 'P'
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    splits {
        abi {
            enable true
            reset()
            include 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'x86', 'x86_64'
            universalApk false
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.0-alpha1'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.0-alpha2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha2'

    implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:5.5.2'
    //implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:6.1.0'
    implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:0.5.0'
    implementation 'com.mapbox.mapboxsdk:mapbox-android-navigation:0.13.0'
    implementation 'com.mapbox.mapboxsdk:mapbox-android-navigation-ui:0.13.0'

    implementation 'com.google.android.gms:play-services-oss-licenses:15.0.1'
    implementation 'com.google.code.gson:gson:2.8.2'
    implementation 'com.squareup.moshi:moshi:1.5.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.retrofit2:converter-moshi:2.4.0'
    implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'
}

biên tập:

Tôi nên lưu ý rằng tôi đang sử dụng Android Studio phiên bản 3.2 canary 14. Có vẻ như đã có một số lỗi được báo cáo cho phiên bản này và tôi nghi ngờ đây là một trong số chúng.

chỉnh sửa 2:

Vấn đề vẫn tồn tại với Android Studio phiên bản 3.2 canary 15, nhưng tôi đã tìm thấy một cách giải quyết cho nó bằng cách sử dụng show()hide()

override fun onCreate(savedInstanceState: Bundle?) {
    demoFab = findViewById(R.id.demoFab)
    demoFab.show()    // this works and doesn't have the warning
}

Gói chính xác là android.support.design.widget.FloatingActionButton
Pankaj Kumar

Với Android P và Jetpack, Fab đã được chuyển sang gói này, đó là thứ tôi đang cố gắng sử dụng. developer.android.com/reference/com/google/android/m vật liệu
Kẻ

@KyleFalconer Canary 15 hiện đã có sẵn, hãy kiểm tra xem bản cập nhật có thể khắc phục sự cố của bạn không :)
Levi Moreira

2
@PankajKumar Yup, vẫn bị hỏng, nhưng tôi đã tìm thấy một cách giải quyết khác cho nó (đã thêm "chỉnh sửa 2" vào câu hỏi của tôi).
Kyle Falconer

5
Vấn đề này mô tả lỗi: suetracker.google.com/issues/115924750 Thật không may, không có giải pháp hoặc sửa lỗi atm, vì vậy có lẽ mọi người bị ảnh hưởng đều phải đánh dấu sao.
ChristophK

Câu trả lời:


266

Sử dụng phương pháp 1

demoFab.show(); // in place of visible
demoFab.hide(); // in place of Invisible suppress the warning/error for me.

và Phương pháp 2

@SuppressLint("RestrictedApi") // also suppressed the warning
private void setUp() {
    ....
}

cập nhật:

Cách 3:

demoFab.setVisibility(View.GONE);
demoFab.setVisibility(View.INVISIBLE);
demoFab.setVisibility(View.VISIBLE);

Cách 4:

demoFab.visibility = View.GONE
demoFab.visibility = View.INVISIBLE
demoFab.visibility = View.VISIBLE

2
Điều này cũng thêm hình ảnh động đẹp!
ROR

1
xin chào, có phương pháp Gone và InvISIBLE không?
Siarhei

Sử dụng .show () có thể xóa cảnh báo, nhưng có một vấn đề: nếu FAB đã đặt, ví dụ như trong XML, android: alpha = "0.5" để minh bạch, thì độ trong suốt không hoạt động. Làm thế nào để khắc phục vấn đề này? Thay vào đó, tôi sẽ thích sử dụng demoFab.visibility = View.VISIBLE nếu .show () không thể hoạt động trên Android: alpha
Fisher

phương thức hiển thị và ẩn là hoàn hảo cho các nút hành động nổi tiêu chuẩn.
FirestormXYZ

9

Có vẻ như hoạt động tốt chỉ để đưa nó vào một cái nhìn.

(mFloatingActionButton as View).visibility = INVISIBLE

Tất nhiên bạn cần phải nhớ rằng khả năng hiển thị có thể ảnh hưởng đến các thành phần khác, vì vậy có lẽ bạn nên sử dụng show()hide()cùng một lúc để làm cho các thành phần chắc chắn khác được thông báo về sự thay đổi.


5
Nếu tôi muốn đặt chế độ hiển thị thành Gone thay vì BÍ MẬT thì sao?
charlie

1
@charlie Bạn mong đợi sự khác biệt nào giữa Gone và INVISIBLE từ nút hành động nổi? Một fab thường nằm phía trên phần còn lại của bố cục để nó không chiếm bất kỳ không gian nào.
1 đáng kinh ngạc

6

Sử dụng:

 myButton.hide();
 myClearButton.hide();

Một ví dụ điển hình sẽ là:

Ẩn và hiển thị các nút khi người dùng đang nhập hoặc tập trung vào tài nguyên EditText:

kiểm tra xem người dùng đang gõ hoặc có tiêu điểm:

 mCommentField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View view, boolean hasFocus) {
            if (hasFocus) {
                //user has focused
                showBts();

            } else {
                //focus has stopped perform your desired action
                hideButtons();
            }
        }


    });

Ẩn và hiển thị các phương thức nút:

private void hideButtons() {

    mCommentButton.hide();
    mClearButton.hide();
}

private void showBts() {

    mCommentButton. show();
    mClearButton.show();

Và trong xml của bạn, hãy đặt các nút thành vô hình theo mặc định để chúng chỉ hiển thị / hiển thị khi người dùng tập trung hoặc đang gõ:

android:visibility="invisible"

Thực hành tốt nhất:

 android:visibility="Gone"

Sử dụng khả năng hiển thị đi có nghĩa là chế độ xem của bạn không chiếm bất kỳ khoảng trống nào trên bố cục của bạn trong khi "vô hình" sẽ chiếm không gian không cần thiết trên bố cục của bạn

Trong ví dụ này: Chế độ xem của tôi nằm trong ViewHolder và tôi tham chiếu các nút từ đoạn aa với recylerview


3

Điều này cũng hoạt động:

findViewById(R.id.fab).setVisibility(View.GONE);

Có, tôi đã sử dụng một đoạn trong ví dụ của mình: setVisibility (View.GONE); không phải lúc nào cũng hoạt động theo từng mảnh, đặc biệt là khi bạn đã tuyên bố các quan điểm của mình trong một khung nhìn. Đó là một lớp riêng biệt và bạn chỉ tham khảo từ Viewholder.
RileyManda

0

Đối với Kotlin tôi có một phương thức mở rộng

fun viewsVisibility(visibility: Int, vararg views: View) {
    for (view in views) { view.visibility = visibility }
}

Sau đó, trong mã bạn có thể làm như sau

viewsVisibility(View.VISIBLE, demoFab) 
viewsVisibility(View.GONE, demoFab)
viewsVisibility(View.INVISIBLE, demoFab, addFab, removeFab)

Lỗi sẽ biến mất và điều này mang lại sự linh hoạt cho bất kỳ trạng thái hiển thị nào cùng với việc đưa vào danh sách các chế độ xem để xử lý. Có rất nhiều lần tôi cần xử lý nhiều hơn một lượt xem tại một thời điểm như trong dòng ví dụ cuối cùng.


0
if(data){
            fragmentPendingApprovalDetailsBinding.fabPendingList.show();
        }else {
            fragmentPendingApprovalDetailsBinding.fabPendingList.hide();
        }

0

Dành cho com.google.android.material.floatingactionbutton.FloatingActionButton

Hiển thị

Sử dụng chương trình và ẩn các phương thức để làm sinh động khả năng hiển thị của FloatingActionButton. Hoạt hình hiển thị phát triển widget và làm mờ nó trong khi hoạt hình ẩn thu nhỏ widget và làm mờ dần nó.

Nguồn: https : // m Material.io/develop/android/components/floating-action-button/

Đối với android.support.design.widget.FloatingActionButton sử dụng setVisibility()phương pháp


0

Đối với tôi các phương pháp trên không hoạt động nên tôi đã tạo một hàm mở rộng để làm cho nó hoạt động.

fun View.showView() {
    this.visibility = View.VISIBLE
}

fun View.hideView() {
    this.visibility = View.GONE
}

bây giờ gọi như

binding.fabAdded.showView()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.