안 드 로 이 드 사용자 정의 Toast 설정 표시 시간

안 드 로 이 드 를 개발 한 학생 들 은 Toast 설정 이 표시 되 는 시간 이 잘못 되 었 다 고 불평 할 수 있 습 니 다.Toast.LENGTH 밖 에 없습니다.LONG 혹은 Toast.LENGTHSHORT 중 하 나 는 이러한 방법 을 해결 하기 위해 여러 가지 실현 방식 이 있 습 니 다.
1.타 이 머 를 사용 하여 정시 에 show()방법 을 호출 합 니 다.
2.CountDownTimer 클래스 를 사용 하 는 것 도 show()방법 을 호출 합 니 다.
3.WindownManager 클래스 를 사용 하여 구현 합 니 다.
본 고 는 사용 방법 3 을 실현 하 는데 난이도 가 크 지 않 으 니 코드 를 직접 보 세 요.

package com.open.toast;
 
import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
 
/**
 *       Toast
 * @author DexYang
 *
 */
public class CToast {
 
 public static CToast makeText(Context context, CharSequence text, int duration) 
 {
  CToast result = new CToast(context);
  
  LinearLayout mLayout=new LinearLayout(context);
  TextView tv = new TextView(context);
  tv.setText(text);
  tv.setTextColor(Color.WHITE);
  tv.setGravity(Gravity.CENTER);
  mLayout.setBackgroundResource(R.drawable.widget_toast_bg);
  
  int w=context.getResources().getDisplayMetrics().widthPixels / 2;
  int h=context.getResources().getDisplayMetrics().widthPixels / 10;
  mLayout.addView(tv, w, h);
  result.mNextView = mLayout;
  result.mDuration = duration;
 
  return result;
 }
 
 public static final int LENGTH_SHORT = 2000;
 public static final int LENGTH_LONG = 3500;
 
 private final Handler mHandler = new Handler(); 
 private int mDuration=LENGTH_SHORT;
 private int mGravity = Gravity.CENTER;
 private int mX, mY;
 private float mHorizontalMargin;
 private float mVerticalMargin;
 private View mView;
 private View mNextView;
 
 private WindowManager mWM;
 private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
 
 
 public CToast(Context context) {
   init(context);
  }
 
 /**
  * Set the view to show.
  * @see #getView
  */
 public void setView(View view) {
  mNextView = view;
 }
 
 /**
  * Return the view.
  * @see #setView
  */
 public View getView() {
  return mNextView;
 }
 
 /**
  * Set how long to show the view for.
  * @see #LENGTH_SHORT
  * @see #LENGTH_LONG
  */
 public void setDuration(int duration) {
  mDuration = duration;
 }
 
 /**
  * Return the duration.
  * @see #setDuration
  */
 public int getDuration() {
  return mDuration;
 }
 
 /**
  * Set the margins of the view.
  *
  * @param horizontalMargin The horizontal margin, in percentage of the
  *  container width, between the container's edges and the
  *  notification
  * @param verticalMargin The vertical margin, in percentage of the
  *  container height, between the container's edges and the
  *  notification
  */
 public void setMargin(float horizontalMargin, float verticalMargin) {
  mHorizontalMargin = horizontalMargin;
  mVerticalMargin = verticalMargin;
 }
 
 /**
  * Return the horizontal margin.
  */
 public float getHorizontalMargin() {
  return mHorizontalMargin;
 }
 
 /**
  * Return the vertical margin.
  */
 public float getVerticalMargin() {
  return mVerticalMargin;
 }
 
 /**
  * Set the location at which the notification should appear on the screen.
  * @see android.view.Gravity
  * @see #getGravity
  */
 public void setGravity(int gravity, int xOffset, int yOffset) {
  mGravity = gravity;
  mX = xOffset;
  mY = yOffset;
 }
 
  /**
  * Get the location at which the notification should appear on the screen.
  * @see android.view.Gravity
  * @see #getGravity
  */
 public int getGravity() {
  return mGravity;
 }
 
 /**
  * Return the X offset in pixels to apply to the gravity's location.
  */
 public int getXOffset() {
  return mX;
 }
 
 /**
  * Return the Y offset in pixels to apply to the gravity's location.
  */
 public int getYOffset() {
  return mY;
 }
 
 /**
  * schedule handleShow into the right thread
  */
 public void show() {
  mHandler.post(mShow);
  
  if(mDuration>0)
  {
   mHandler.postDelayed(mHide, mDuration);
  }
 }
 
 /**
  * schedule handleHide into the right thread
  */
 public void hide() {
  mHandler.post(mHide);
 }
 
 private final Runnable mShow = new Runnable() {
  public void run() {
   handleShow();
  }
 };
 
 private final Runnable mHide = new Runnable() {
  public void run() {
   handleHide();
  }
 };
 
 private void init(Context context)
 { 
  final WindowManager.LayoutParams params = mParams;
   params.height = WindowManager.LayoutParams.WRAP_CONTENT;
   params.width = WindowManager.LayoutParams.WRAP_CONTENT;
   params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
     | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
     | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
   params.format = PixelFormat.TRANSLUCENT;
   params.windowAnimations = android.R.style.Animation_Toast;
   params.type = WindowManager.LayoutParams.TYPE_TOAST;
   params.setTitle("Toast");
   
   mWM = (WindowManager) context.getApplicationContext()
     .getSystemService(Context.WINDOW_SERVICE);
 }
 
 
 private void handleShow() {
 
  if (mView != mNextView) {
   // remove the old view if necessary
   handleHide();
   mView = mNextView;
//   mWM = WindowManagerImpl.getDefault();
   final int gravity = mGravity;
   mParams.gravity = gravity;
   if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) 
   {
    mParams.horizontalWeight = 1.0f;
   }
   if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) 
   {
    mParams.verticalWeight = 1.0f;
   }
   mParams.x = mX;
   mParams.y = mY;
   mParams.verticalMargin = mVerticalMargin;
   mParams.horizontalMargin = mHorizontalMargin;
   if (mView.getParent() != null) 
   {
    mWM.removeView(mView);
   }
   mWM.addView(mView, mParams);
  }
 }
 
 private void handleHide() 
 {
  if (mView != null) 
  {
   if (mView.getParent() != null) 
   {
    mWM.removeView(mView);
   }
   mView = null;
  }
 }
}
테스트 클래스 의 코드 는 다음 과 같 습 니 다.

package com.open.toast;
 
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
 
public class MainActivity extends Activity {
 
 
 private EditText mEditText;
 private CToast mCToast;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 init();
 }
 
 
 private void init()
 {
 mEditText=(EditText)findViewById(R.id.timeEditText);
 findViewById(R.id.showToastBtn).setOnClickListener(listener);
 findViewById(R.id.hideToastBtn).setOnClickListener(listener);
 }
 
 private View.OnClickListener listener=new View.OnClickListener() {
 
 @Override
 public void onClick(View v) {
 switch(v.getId())
 {
 case R.id.showToastBtn:
  if(null!=mCToast)
  {
  mCToast.hide();
  }
  int time=TextUtils.isEmpty(mEditText.getText().toString())?CToast.LENGTH_SHORT:Integer.valueOf(mEditText.getText().toString());
  mCToast=CToast.makeText(getApplicationContext(), "   CToast!",time);
  mCToast.show();
  break;
 
 case R.id.hideToastBtn:
  if(null!=mCToast)
  {
  mCToast.hide();
  }
  break;
 }
 
 }
 };
 
}
효 과 는 다음 과 같 습 니 다:

원본 다운로드:안 드 로 이 드 사용자 정의 Toast 설정 표시 시간
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기