[android] Android Multiline Snackbar

http://www.google.com/design/spec/components/snackbars-toasts.html#snackbars-toasts-specs에Snackbar 표시된대로 Android 디자인 지원 라이브러리의 새로운 기능을 활용 하여 여러 줄 스낵바를 표시 하려고합니다 .

import android.support.design.widget.Snackbar;

final String snack = "First line\nSecond line\nThird line";
Snackbar.make(mView, snack, Snackbar.LENGTH_LONG).show();

First line...내 Nexus 7 에만 표시됩니다. 모든 행을 표시하려면 어떻게해야합니까?

추신 : 시도했는데 Toast모든 라인이 표시되었습니다.



답변

maxLinesSnackbars Textview 의 속성을 설정하기 만하면됩니다.

View snackbarView = snackbar.getView();
TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setMaxLines(5);  // show multiple line

최신 버전을 사용하는 경우 "com.google.android.material:material:1.0.0" 종속성을 다음을 사용 com.google.android.material.R.id.snackbar_text하여 Snackbar의 TextView에 액세스합니다.

당신도 사용할 수 있습니다 R.id.snackbar_text. 그것은 나를위한 일입니다.


답변

앱의 values.xml에서 사용되는 미리 정의 된 값을 재정의 할 수 있습니다.

<integer name="design_snackbar_text_max_lines">5</integer>

이 값은 기본적으로 Snackbar에서 사용됩니다.


답변

Snackbar snackbar =  Snackbar.make(view, "Text",Snackbar.LENGTH_LONG).setDuration(Snackbar.LENGTH_LONG);
View snackbarView = snackbar.getView();
TextView tv= (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
tv.setMaxLines(3);
snackbar.show();


답변

이것에 대한 나의 발견은 다음과 같습니다.

Android는 여러 줄 스낵바를 지원하지만 여러 줄 스낵바의 높이가 80dp (거의 2 줄)가되어야한다는 설계 지침과 일치하는 최대 2 줄로 제한됩니다.

이를 확인하기 위해 cheesesquare android 샘플 프로젝트를 사용했습니다. 다음 문자열을 사용하는 경우 :

Snackbar.make(view, "Random Text \n When a second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

이 경우 두 번째 줄의 텍스트가있는 여러 줄 스낵바를 볼 수 있습니다 (예 : “두 번째 스낵바가 트리거 될 때”).하지만이 코드를 다음 구현으로 변경하면 :

Snackbar.make(view, "Random Text \n When \n a second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

“임의 텍스트 \ n시기 ” 만 볼 수 있습니다 . 이것은 디자인 라이브러리가 의도적으로 textview를 최대 2 줄로 강제한다는 것을 의미합니다.


답변

머티리얼 디자인의 경우 참조는 com.google.android.material.R.id.snackbar_text

val snack = Snackbar.make(myView, R.string.myLongText, Snackbar.LENGTH_INDEFINITE).apply {
                view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text).maxLines = 10
            }
            snack.show()


답변

스낵바에 포함 된 textview의 리소스 ID를 하드 코딩하는 것과 관련된 제안에 대한 대안은 TextView를 찾기 위해 반복하는 것입니다. 장기적으로 더 안전하며 ID 변경에 대한 두려움을 최소화하면서 지원 라이브러리를 업데이트 할 수 있습니다.

예:

 public static Snackbar getSnackbar(View rootView, String message, int duration) {
    Snackbar snackbar = Snackbar.make(rootView, message, duration);
    ViewGroup snackbarLayout = (ViewGroup) snackbar.getView();

    TextView text = null;

    for (int i = 0; i < snackbarLayout.getChildCount(); i++) {
        View child = snackbarLayout.getChildAt(i);

        // Since action is a button, and Button extends TextView,
        // Need to make sure this is the message TextView, not the 
        // action Button view.
        if(child instanceof TextView && !(child instanceof Button)) {
            text = (TextView) child;
        }
    }

    if (text != null) {
        text.setMaxLines(3);
    }
    return snackbar;
}


답변

setMaxLines를 사용하는 대신 setSingleLine을 사용하여 textview를 내용으로 래핑합니다.

String yourText = "First line\nSecond line\nThird line";
Snackbar snackbar = Snackbar.make(mView, yourText, Snackbar.LENGTH_SHORT);
    TextView textView =
        (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
    textView.setSingleLine(false);
snackbar.show();