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クラスの構造関数は以下の通りです.
Toastクラスの静的メソッドmakeText(context,text,duration)のソースコードは次のとおりです.
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)を見てみましょう.
ビューを指定しない場合、mNextViewの値はnullになります.異常を投げ出す.また、1つ目の方法を使用すると、ToastにViewを設定しても呼び出すことはできません:toast.setText(s);
投げ出すmakeText()異常.解決策はTextViewを定義し、TextViewに値を割り当て、XXLayoutに追加することです.
setView(XXLayout)を使用して、XXLayoutをToastのViewに設定します.
次の2つの方法でToastを作成します.
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();
}