Toastの使い方

4197 ワード

Toastはandroidで短い情報をすばやく表示するためのメカニズムで、toastには焦点がなく、表示時間に制限があり、時間が経つと自動的に消えてしまいますが、自分で時間表示の長さをコントロールすることができます.Toastの構築方法は2つあり、1つ目は構造関数を直接呼び出すことである:Toast toast=new Toast(context);
2つ目は、Toastクラスを呼び出す静的方法である:Toast toast=Toast.makeText(context, text, duration);
この2つの方法には違いがあり、Toastのソースコードを見るとわかります.Toastクラスの構造関数は以下の通りです.
 
public Toast(Context context) {
        mContext = context;
        mTN = new TN(context);
        mY = context.getResources().getDimensionPixelSize(
                com.android.internal.R.dimen.toast_y_offset);
    }
 
 
Toastクラスの静的メソッドmakeText(context,text,duration)のソースコードは次のとおりです.
 
 public static Toast makeText(Context context, CharSequence text, 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;
    }

ToastクラスにはプロパティmNextViewが重要です.これはViewです.Toastが表示するviewを指定します.最初のメソッドを使用してToastを取得する場合は、必ずToastのsetView(View v)メソッドを呼び出してToastにviewを指定します.2番目のメソッドを使用すると、setView(View v)を表示する必要はありません.上のコードを見てください.result.mNextView = v.
なぜ最初の方法でToastを得るときに指定されたViewを表示する必要があるのか、Toastのshow()とsetText(CharSequence)を見てみましょう.
 
 /**
     * Show the view for the specified duration.
     */
    public void show() {
        if (mNextView == null) {
            throw new RuntimeException("setView must have been called");
        }

        INotificationManager service = getService();

        String pkg = mContext.getPackageName();

        TN tn = mTN;

        try {
            service.enqueueToast(pkg, tn, mDuration);
        } catch (RemoteException e) {
            // Empty
        }
    }

/**
     * Update the text in a Toast that was previously created using one of the makeText() methods.
     * @param s The new text for the Toast.
     */
public void setText(CharSequence s) {
        if (mNextView == null) {
            throw new RuntimeException("This Toast was not created with Toast.makeText()");
        }
        TextView tv = (TextView) mNextView.findViewById(com.android.internal.R.id.message);
        if (tv == null) {
            throw new RuntimeException("This Toast was not created with Toast.makeText()");
        }
        tv.setText(s);
    }

ビューを指定しない場合、mNextViewの値はnullになります.異常を投げ出す.また、1つ目の方法を使用すると、ToastにViewを設定しても呼び出すことはできません:toast.setText(s);
 
投げ出すmakeText()異常.解決策はTextViewを定義し、TextViewに値を割り当て、XXLayoutに追加することです.
setView(XXLayout)を使用して、XXLayoutをToastのViewに設定します.
 
 
次の2つの方法でToastを作成します.
 
 
/**
 *     Toast,       
 */
    private void showToast() {
    		Toast t = new Toast(this);
		t.setDuration(Toast.LENGTH_SHORT);
		LinearLayout layout = new LinearLayout(this);
		layout.setBackgroundResource(R.drawable.toast_bg);
		TextView textView = new TextView(this);
		textView.setText("javaeye:  !");
		textView.setTextSize(14);
		textView.setTextColor(Color.WHITE);
		layout.addView(textView);
		t.setView(layout);
		t.setGravity(Gravity.TOP, 100+20, 200 + 20);
		t.show();
    }
 
    /**
     *    Toast  
     */
    private void showToast2() {
    		Toast t = Toast.makeText(this, "csdn:  !", Toast.LENGTH_SHORT);
		t.setGravity(Gravity.TOP, 100+20, 200 + 20);
		t.show();
    }