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
모든 라인이 표시되었습니다.
답변
maxLines
Snackbars 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();