Android 에서 Toast 의 사용자 정의 사용 공유

1.Toast 소스 코드 분석
낡은 규칙,우 리 는 먼저 Toast 의 소스 코드 를 보 러 간다.
Toast 는 두 가지 디 스 플레이 레이아웃 방식 이 있 는데 하 나 는 Toast.makeText()  을 가장 자주 호출 하 는 것 입 니 다.소스 코드 를 보면 이렇게 쓰 여 있 습 니 다.

public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
Toast result = new Toast(context);

LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);

result.mNextView = v;
result.mDuration = duration;

return result;
}
transient_notification 이 레이아웃 파일 코드 는 이 렇 습 니 다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="?android:attr/toastFrameBackground">

<TextView
android:id="@android:id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_horizontal"
android:textAppearance="@style/TextAppearance.Toast"
android:textColor="@color/bright_foreground_dark"
android:shadowColor="#BB000000"
android:shadowRadius="2.75"
/>

</LinearLayout>
그러면 Toast 의 문자 메시지 스타일 을 수정 하려 고 합 니 다.사실은 Toast 루트 레이아웃 과 message 라 는 TextView 를 수정 하 는 것 입 니 다.
Toast 의 또 다른 디 스 플레이 모드 는 사용자 정의 레이아웃 디 스 플레이 입 니 다.이 방법 은 Toast.makeText() 방법 을 사용 하지 않 고 new Toast 대상 을 사용 한 다음 에 setView() 방법 을 사용 합 니 다.물론 사용자 정의 레이아웃 은 transient_notification 레이아웃 을 불 러 오지 않 습 니 다.
2.사용자 정의 Toast 구현
제 가 봉 인 된 공구 류 ToastUtil 을 먼저 보 여 드 리 겠 습 니 다.

import android.content.Context;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by     on 2016/8/11.
 */
public class ToastUtil {

private Toast toast;
private LinearLayout toastView;

/**
 *       Toast
 */
public ToastUtil() {

}

/**
 *        Toast
 * @param context
 * @param view
 */
public ToastUtil(Context context, View view,int duration){
  toast=new Toast(context);
  toast.setView(view);
  toast.setDuration(duration);
}

/**
 *  Toast      view
 * @param view
 * @param postion
 * @return
 */
public ToastUtil addView(View view,int postion) {
  toastView = (LinearLayout) toast.getView();
  toastView.addView(view, postion);

  return this;
}

/**
 *   Toast       
 * @param messageColor
 * @param backgroundColor
 * @return
 */
public ToastUtil setToastColor(int messageColor, int backgroundColor) {
  View view = toast.getView();
  if(view!=null){
    TextView message=((TextView) view.findViewById(android.R.id.message));
    message.setBackgroundColor(backgroundColor);
    message.setTextColor(messageColor);
  }
  return this;
}

/**
 *   Toast     
 * @param messageColor
 * @param background
 * @return
 */
public ToastUtil setToastBackground(int messageColor, int background) {
  View view = toast.getView();
  if(view!=null){
    TextView message=((TextView) view.findViewById(android.R.id.message));
    message.setBackgroundResource(background);
    message.setTextColor(messageColor);
  }
  return this;
}

/**
 *      Toast
 */
public ToastUtil Short(Context context, CharSequence message){
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message, Toast.LENGTH_SHORT);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(Toast.LENGTH_SHORT);
  }
  return this;
}

/**
 *      Toast
 */
public ToastUtil Short(Context context, int message) {
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message, Toast.LENGTH_SHORT);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(Toast.LENGTH_SHORT);
  }
 return this;
}

/**
 *      Toast
 */
public ToastUtil Long(Context context, CharSequence message){
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message, Toast.LENGTH_LONG);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(Toast.LENGTH_LONG);
  }
  return this;
}

/**
 *      Toast
 *
 * @param context
 * @param message
 */
public ToastUtil Long(Context context, int message) {
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message, Toast.LENGTH_LONG);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(Toast.LENGTH_LONG);
  }
  return this;
}

/**
 *      Toast  
 *
 * @param context
 * @param message
 * @param duration
 */
public ToastUtil Indefinite(Context context, CharSequence message, int duration) {
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message,duration);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(duration);
  }
   return this;
}

/**
 *      Toast  
 *
 * @param context
 * @param message
 * @param duration
 */
public ToastUtil Indefinite(Context context, int message, int duration) {
  if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
    toast= Toast.makeText(context, message,duration);
    toastView=null;
  }else{
    toast.setText(message);
    toast.setDuration(duration);
  }
  return this;
}

/**
 *   Toast
 * @return
 */
public ToastUtil show (){
  toast.show();

  return this;
}

/**
 *   Toast
 * @return
 */
public Toast getToast(){
  return toast;
}
}
Toast 배경 색 의 사용법 은 다음 과 같 습 니 다.

ToastUtil toastUtil=new ToastUtil();
toastUtil.Short(MainActivity.this,"   message  、   ").setToastColor(Color.WHITE, getResources().getColor(R.color.colorAccent)).show();

Toast 배경 색 수정
사각형 의 Toast 가 약간 딱딱 해 보 여서 저 는 toast 라 는 이름 을 정 의 했 습 니 다.radius.xml 배경,코드 는 다음 과 같 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--       -->
<solid android:color="#ffc107" />

<!-- android:radius       -->
<corners android:radius="20dip" />

</shape>
그리고 위 에 배경 을 설정 한 코드 를 다음 과 같이 바 꿉 니 다.

toastUtil.Short(MainActivity.this,"   message       ").setToastBackground(Color.WHITE,R.drawable.toast_radius).show();

배경 을 수정 한 Toast
공식 적 으로 Toast 와 Snackbar 는 모두 짧 은 텍스트 형식 이 어야 하 며 아이콘 을 포함 할 수 없다 고 생각 하지만 개인 적 으로 아이콘 을 추가 하 는 것 이 재 미 있 을 것 같 습 니 다.
Toast 에 아이콘 을 추가 하면 다음 과 같 습 니 다:

 ImageView toastImage = new ImageView(getApplicationContext());
 toastImage.setImageResource(R.mipmap.ic_launcher);
 toastUtil.Short(MainActivity.this," Toast     ImageView").setToastBackground(Color.WHITE,R.drawable.toast_radius).addView(toastImage,0).show();

아이콘 추가 Toast
Toast 에서 사용자 정의 레이아웃 을 표시 하려 면 다음 과 같이 할 수 있 습 니 다.

 View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.image,null);
 new ToastUtil(MainActivity.this,view,Toast.LENGTH_SHORT).show();

사용자 정의 레이아웃 Toast,내 레이아웃 파일 에 기본 아이콘 만 있 는 ImageView
Toast 의 show() 방법 을 연속적으로 터치 할 때 Toast 는 줄 을 서서 연속적으로 보 여 주 며 그다지 우호 적 이지 않다 는 것 을 잘 알 고 있다.그래서 저 는 먼저 toast 가 만 들 지 않 았 거나 추가 view 가 추가 되 었 는 지 판단 하 였 습 니 다.그렇다면 toast 대상 을 다시 만 듭 니 다.그렇지 않 으 면 message 문자 와 표시 시간 만 수정 합 니 다.

Toast 레이아웃 수정,대기 열 표시 하지 않 음
총결산
나의 이 공구 류 는 완전 체 가 아니 므 로,여러분 은 다시 자신의 프로젝트 의 구체 적 인 수요 에 따라 수정 하 세 요.이상 은 안 드 로 이 드 에서 Toast 의 플 라 워 가 사용 하 는 모든 내용 입 니 다.관심 있 는 친구 들 은 빨리 스스로 실천 하 세 요.

좋은 웹페이지 즐겨찾기