토스트에 이미지를 추가 하시겠습니까?
토스트 팝업에 프로그래밍 방식으로 이미지를 추가 할 수 있습니까?
예 , setView () 메소드를 사용하여 토스트 알림에 imageview 또는 모든보기를 추가 할 수 있습니다.이 메소드를 사용하면 요구 사항에 따라 토스트를 사용자 정의 할 수 있습니다.
여기에서는 Toast 알림으로 확장 할 사용자 지정 레이아웃 파일을 만든 다음 setView () 메서드를 사용하여 Toast 알림에서이 레이아웃을 사용했습니다.
cust_toast_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/relativeLayout1"
android:background="@android:color/white">
<TextView
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/textView1" android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="PM is here"
android:gravity="center"
android:textColor="@android:color/black">
</TextView>
<ImageView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:src="@drawable/new_logo"
android:layout_below="@+id/textView1"
android:layout_margin="5dip"
android:id="@+id/imageView1">
</ImageView>
<TextView
android:id="@+id/textView2"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="This is the demo of Custom Toast Notification"
android:gravity="center"
android:layout_below="@+id/imageView1"
android:textColor="@android:color/black">
</TextView>
</RelativeLayout>
CustomToastDemoActivity.java
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.cust_toast_layout,
(ViewGroup)findViewById(R.id.relativeLayout1));
Toast toast = new Toast(this);
toast.setView(view);
toast.show();
간단히 다음을 사용하십시오.
Toast toast = new Toast(myContext);
ImageView view = new ImageView(myContext);
view.setImageResource(R.drawable.image_icon);
toast.setView(view);
toast.show();
모든 뷰를 프로그래밍 방식으로 만들고 (LayoutInflater를 사용하지 않고이 작업을 수행하는 방법을 묻는 것으로 가정하므로) 만든 Toast에서 setView를 호출 할 수 있습니다.
//Create a view here
LinearLayout v = new LinearLayout(this);
//populate layout with your image and text or whatever you want to put in here
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(v);
toast.show();
Knickedi의 솔루션은 좋지만 텍스트 옆에 아이콘 만 필요한 경우 Toast에 동일한 ID로 미리 정의 된 TextView가 있고 TextView에 아이콘을 설정한다는 사실을 활용할 수 있습니다.
Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
TextView tv = (TextView) toast.getView().findViewById(android.R.id.message);
if (null!=tv) {
tv.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0);
tv.setCompoundDrawablePadding(context.getResources().getDimensionPixelSize(R.dimen.padding_toast));
사용자 지정 레이아웃을 만들 수있는 가능성은 항상 있습니다. 내가 싫어하는 한 가지 사실은 시스템 기본 토스트 UI가 깨졌습니다. 이는 플랫폼과 구현에 따라 다를 수 있습니다. 시스템 기본 리소스를 사용하는 간단한 방법이 없으므로 토스트를 해킹하고 이미지를 강제로 사용하기로 결정했습니다.
힌트 : 다음과 같은 기본 리소스를 얻을 수 있습니다.
Toast.makeToast(context, "", 0).getView().getBackground()
다음은 토스트 메시지 앞에 이미지를 표시하는 도우미입니다. Helper.makeImageToast(context, R.drawable.my_image, "Toast with image", Toast.LENGTH_SHORT).show()
성공, 정보 또는 오류를 나타내는 데 사용합니다. 토스트 정보를 더 멋지고 표현력있게 만듭니다 ...
(내부 토스트가 LinearLayout
시스템과 구현에 독립적이지 않다는 사실을 기반으로하는 해킹이라는 점을 언급 할 가치가 있습니다. 주석을 참조하십시오.)
public static Toast makeImageToast(Context context, int imageResId, CharSequence text, int length) {
Toast toast = Toast.makeText(context, text, length);
View rootView = toast.getView();
LinearLayout linearLayout = null;
View messageTextView = null;
// check (expected) toast layout
if (rootView instanceof LinearLayout) {
linearLayout = (LinearLayout) rootView;
if (linearLayout.getChildCount() == 1) {
View child = linearLayout.getChildAt(0);
if (child instanceof TextView) {
messageTextView = (TextView) child;
}
}
}
// cancel modification because toast layout is not what we expected
if (linearLayout == null || messageTextView == null) {
return toast;
}
ViewGroup.LayoutParams textParams = messageTextView.getLayoutParams();
((LinearLayout.LayoutParams) textParams).gravity = Gravity.CENTER_VERTICAL;
// convert dip dimension
float density = context.getResources().getDisplayMetrics().density;
int imageSize = (int) (density * 25 + 0.5f);
int imageMargin = (int) (density * 15 + 0.5f);
// setup image view layout parameters
LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(imageSize, imageSize);
imageParams.setMargins(0, 0, imageMargin, 0);
imageParams.gravity = Gravity.CENTER_VERTICAL;
// setup image view
ImageView imageView = new ImageView(context);
imageView.setImageResource(imageResId);
imageView.setLayoutParams(imageParams);
// modify root layout
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.addView(imageView, 0);
return toast;
}
makeImageToast 함수에 전달하는 이미지에 Toast의 텍스트를 표시하는 것이 더 낫다고 생각하므로 Knickedi 코드를 음영 처리하고 다음을 수행합니다.
public class utility {
public static Toast makeImageToast(Context context, int imageResId, CharSequence text, int length) {
Toast toast = Toast.makeText(context, text, length);
View rootView = toast.getView();
LinearLayout linearLayout = null;
View messageTextView = null;
// check (expected) toast layout
if (rootView instanceof LinearLayout) {
linearLayout = (LinearLayout) rootView;
if (linearLayout.getChildCount() == 1) {
View child = linearLayout.getChildAt(0);
if (child instanceof TextView) {
messageTextView = (TextView) child;
((TextView) child).setGravity(Gravity.CENTER);
}
}
}
// cancel modification because toast layout is not what we expected
if (linearLayout == null || messageTextView == null) {
return toast;
}
ViewGroup.LayoutParams textParams = messageTextView.getLayoutParams();
((LinearLayout.LayoutParams) textParams).gravity = Gravity.CENTER;
// convert dip dimension
float density = context.getResources().getDisplayMetrics().density;
int imageSize = (int) (density * 25 + 0.5f);
int imageMargin = (int) (density * 15 + 0.5f);
// setup image view layout parameters
LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(imageSize, imageSize);
imageParams.setMargins(0, 0, imageMargin, 0);
imageParams.gravity = Gravity.CENTER;
// setup image view
ImageView imageView = new ImageView(context);
imageView.setImageResource(imageResId);
imageView.setLayoutParams(imageParams);
// modify root layout
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.setBackgroundResource(imageResId);
linearLayout.setGravity(Gravity.CENTER);
linearLayout.setHorizontalGravity(Gravity.CENTER);
linearLayout.setHorizontalGravity(Gravity.CENTER);
//addView(imageView, 0);
return toast;
}
}
그리고 이것은 그것의 사용입니다 :
utility.makeImageToast(getApplicationContext(),
R.drawable.your_image,"your_text",Toast.LENGTH_LONG).show();
Toast aa = Toast.makeText(getBaseContext(), "OPEN",Toast.LENGTH_SHORT);
ImageView cc = new ImageView(getBaseContext());
cc.setImageResource(R.drawable.a);
aa.setView(cc);
aa.show();
참고 URL : https://stackoverflow.com/questions/7571917/adding-image-to-toast
'developer tip' 카테고리의 다른 글
Firebase 연결이 끊어 지거나 회복되었는지 감지 (0) | 2020.12.08 |
---|---|
MiniTest에서 어떻게 스텁을 수행합니까? (0) | 2020.12.07 |
CSS 표시 : 인라인 블록이 여백 상단을 허용하지 않습니까? (0) | 2020.12.07 |
[NSDate date]로 현재 날짜 및 시간 가져 오기 (0) | 2020.12.07 |
C # DllImport에서 32 비트 또는 64 비트 DLL 사용 (0) | 2020.12.07 |