[android] 지원 라이브러리가있는 FloatingActionButton 예제

최근에 나는이 게시물을 읽었습니다.

안드로이드 디자인 지원 라이브러리

Android 지원 라이브러리, 개정판 22.2.0

FloatingActionButton

그러나 그들 중 누구도 new을 만드는 것에 대한 자세한 예를 제공하지 않습니다 FloatingActionButton. 이해하기 어렵 기 때문에이 질문을합니다.

누구든지 그것에 대해 예를 들어 줄 수 있습니까?

도움을 주시면 감사하겠습니다. 미리 감사드립니다.

편집하다

방금 FloatingActionButton(FAB) 에 관한 문제를 발견 했으며 다른 답변을 개선하고 싶습니다. 아래 답변을 참조하십시오.



답변

따라서 build.gradle파일에 다음을 추가하십시오.

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

AndroidX 참고 : Google은 이전 지원 라이브러리 를 대체하기 위해 새로운 AndroidX 확장 라이브러리 를 도입 하고 있습니다. AndroidX를 사용하려면 먼저 파일을 업데이트gradle.properties 하고 편집 하여 (또는 그 이상) build.gradle으로 설정 했는지 확인 하고 이전 파일 대신 다음 줄을 사용하십시오 .compileSdkVersion28compile

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

다음으로, themes.xml또는 당신의 또는 styles.xml무엇이든, 이것을 설정하십시오-이것이 앱의 악센트 색상과 그것을 재정의하지 않는 한 FAB의 색상입니다 (아래 참조).

        <item name="colorAccent">@color/floating_action_button_color</item>

레이아웃의 XML에서 :

<RelativeLayout
 ...
 xmlns:app="http://schemas.android.com/apk/res-auto">

       <android.support.design.widget.FloatingActionButton
            android:id="@+id/myFAB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_plus_sign"
            app:elevation="4dp"
            ... />

</RelativeLayout>

또는 위의 AndroidX 재질 라이브러리를 사용하는 경우 대신 다음을 사용하십시오.

<RelativeLayout
 ...
 xmlns:app="http://schemas.android.com/apk/res-auto">

       <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/myFAB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:srcCompat="@drawable/ic_plus_sign"
            app:elevation="4dp"
            ... />

</RelativeLayout>

문서 (여기서 문서) ( setRippleColor, 등) 에서 더 많은 옵션을 볼 수 있지만 참고 사항 중 하나는 다음과 같습니다.

    app:fabSize="mini"

하나의 FAB의 배경색을 변경하려면 다음을 추가하십시오.

    app:backgroundTint="#FF0000"

(예 : 빨간색으로 변경) 위의 XML로 변경하십시오.

어쨌든 코드에서 Activity / Fragment의 뷰가 팽창 된 후 ….

    FloatingActionButton myFab = (FloatingActionButton)  myView.findViewById(R.id.myFAB);
    myFab.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            doMyThing();
        }
    });

관찰 :

  • 예를 들어 경계가 겹치도록 음의 하단 레이아웃 여백이있는 두 개의보기 (예 : RelativeLayout 사용)를 분할하는 “완벽한”단추 중 하나가있는 경우 FAB의 크기는 실제로 문제가됩니다. 롤리팝과 롤리팝의 차이 가 매우 큽니다. API를 전환 할 때 AS의 시각적 레이아웃 편집기에서 실제로 이것을 볼 수 있습니다. 롤리팝 이전으로 전환하면 갑자기 “퍼프 아웃”됩니다. 추가 크기의 이유는 그림자가 모든 방향으로보기의 크기를 확장하기 때문입니다. 따라서 FAB의 여백이 다른 항목에 가까워지면 조정해야 할 때이 점을 고려해야합니다.
  • 패딩이 너무 많으면 패딩을 제거하거나 변경하는 방법은 다음과 같습니다.

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) myFab.getLayoutParams();
        p.setMargins(0, 0, 0, 0); // get rid of margins since shadow area is now the margin
        myFab.setLayoutParams(p);
    }
    
  • 또한 FAB의 높이를 잡고 2를 나누어 마진 오프셋으로 사용하여 RelativeLayout에서 두 영역 사이의 “심”에 FAB을 프로그래밍 방식으로 배치하려고했습니다. 그러나 myFab.getHeight ()는 뷰가 팽창 된 후에도 0을 반환했습니다. 대신 ViewTreeObserver를 사용하여 배치 한 후에 만 ​​높이를 얻은 다음 위치를 설정했습니다. 여기이 팁을 참조
    하십시오 . 다음과 같이 보였습니다 :

        ViewTreeObserver viewTreeObserver = closeButton.getViewTreeObserver();
        if (viewTreeObserver.isAlive()) {
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                        closeButton.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        closeButton.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }
                    // not sure the above is equivalent, but that's beside the point for this example...
                    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) closeButton.getLayoutParams();
                    params.setMargins(0, 0, 16, -closeButton.getHeight() / 2); // (int left, int top, int right, int bottom)
                    closeButton.setLayoutParams(params);
                }
            });
        }
    

    이것이 올바른 방법인지 확실하지 않지만 작동하는 것 같습니다.

  • 높이를 줄이면 버튼의 그림자 공간을 더 작게 만들 수 있습니다.
  • “심”에 FAB을 사용하려는 경우 다음을 사용할 수 있습니다 . 예는 다음 layout_anchorlayout_anchorGravity같습니다.

    <android.support.design.widget.FloatingActionButton
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        app:layout_anchor="@id/appbar"
        app:layout_anchorGravity="bottom|right|end"
        android:src="@drawable/ic_discuss"
        android:layout_margin="@dimen/fab_margin"
        android:clickable="true"/>
    

스낵바CoordinatorLayout싸여서 스낵바 가 나올 때 자동으로 버튼에서 벗어날 수 있습니다 .

더:


답변

FAB에서 몇 가지 문제를 발견했으며 다른 답변을 향상시키고 싶습니다.


setRippleColor 문제

따라서 프로그래밍 방식으로 잔물결 색상 (누른 색상의 FAB 색상)을 프로그래밍 방식으로 설정하면 문제가 발생합니다 setRippleColor. 그러나 여전히 다음과 같이 설정하는 다른 방법이 있습니다.

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
ColorStateList rippleColor = ContextCompat.getColorStateList(context, R.color.fab_ripple_color);
fab.setBackgroundTintList(rippleColor);

프로젝트는 다음 구조를 가져야합니다.

/res/color/fab_ripple_color.xml

여기에 이미지 설명을 입력하십시오

그리고 코드 fab_ripple_color.xml는 다음과 같습니다.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/fab_color_pressed" />
    <item android:state_focused="true" android:color="@color/fab_color_pressed" />
    <item android:color="@color/fab_color_normal"/>
</selector>

마지막으로 FAB를 약간 변경하십시오.

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_action_add"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    app:fabSize="normal"
    app:borderWidth="0dp"
    app:elevation="6dp"
    app:pressedTranslationZ="12dp"
    app:rippleColor="@android:color/transparent"/> <!-- set to transparent color -->

API 레벨 21 이상의 경우, 오른쪽 및 아래쪽 여백을 24dp로 설정하십시오.

...
android:layout_marginRight="24dp"
android:layout_marginBottom="24dp" />

FloatingActionButton 디자인 가이드

위의 FAB xml 코드에서 볼 수 있듯이 다음과 같이 설정했습니다.

        ...
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        app:elevation="6dp"
        app:pressedTranslationZ="12dp"
        ...
  • 이러한 속성을 설정하면 롤리팝 이전에만 설정 layout_marginTop하고 layout_marginRight다시 설정할 필요가 없습니다 . Android는 Android Lollipop의 일반 FAB와 동일한 화면 오른쪽에 자동으로 배치합니다.

        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
    

또는 다음에서 사용할 수 있습니다 CoordinatorLayout.

        android:layout_gravity="end|bottom"
  • Google 의이 안내서 에 따르면 6dp elevation및 12dp 가 있어야합니다 .pressedTranslationZ

FAB 규칙


답변

FloatingActionButton확장 ImageView합니다. ImageView레이아웃에을 도입하는 것처럼 간단 합니다. 다음은 XML 샘플입니다.

<android.support.design.widget.FloatingActionButton   xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/somedrawable"
    android:layout_gravity="right|bottom"
    app:borderWidth="0dp"
    app:rippleColor="#ffffff"/>

app:borderWidth="0dp" 고도 문제에 대한 해결 방법으로 추가되었습니다.


답변

AndroidX 용

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_add" />


답변

이미 모든 라이브러리를 추가했지만 여전히 작동하지 않는 경우 다음을 사용하십시오.

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_add" 
/>

대신에:

<android.support.design.widget.FloatingActionButton
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   app:srcCompat="@drawable/ic_add"
 />

그리고 모두 잘 작동합니다 🙂


답변