在 for 循环之前显示 toast 不起作用
Show toast prior to a for loop does not work
我试图在 for 循环之前显示祝酒词,但是,祝酒词没有显示。我也尝试添加一个小吃店,但这也没有用。我想知道为什么吐司不先烧。我什至尝试了以下方法,但它一直在循环:
Toast toast = Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
while (!toast.getView().isShown()) {
toast.show();
}
如何在 for 循环之前显示祝酒词?
ArrayList<String> pizzaBases = new ArrayList<> ();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
main.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
}
});
SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);
for (int i = 0; i < 100; i++) {
try {
String pizza = preferences.getString("TypeOfBase" + i, "");
if (!pizza.equals("")) {
pizzaBases.add(pizza);
}
} catch (NullPointerException e) {
//Do nothing here
}
}
}
});
Button button1 = (Button) findViewById(R.id.buttonOne);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (String myString : pizzaBases) {
System.out.println(myString);
}
}
});
}
我尝试了 runOnUiThread、asynctask 和 while 循环等解决方案,但它们都没有显示 toast 或 snackbar。
编辑:
我发现 UI 仅在 for 循环完成后更新。我想知道为什么它会这样做,尽管它是先激活的。
您没有在这一行调用 show() 方法:
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
应该是:
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();
您不需要使用 runOnUiThread
因为您已经在主线程上并且您没有在第二个代码中对您的 toast 调用 show()
。
最好将最近的 Context
对象传递给你的 toast。
public void onClick(View view) {
Toast.makeText(YourActivity.this, "Hello", Toast.LENGTH_SHORT).show(); // show must be called
Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);
...
}
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
show toast时必须调用.show()
方法。
如果您在 Activity
中显示 Toast
,最好使用 Activity
的 context
更正
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();
Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
如果您想显示 SnackBar
,则必须提供当前 activity 而非 android.R.id.content
的视图
更正
Snackbar.make(findViewById(R.id.parent_of_your_activity), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
你不需要使用 runOnUiThread
因为你已经在主线程上了
可以获得Context
通过 YourActivity.this
或 this
在 Activity
本身
通过 getContext()
在 Fragment
class
问题是 Toast.show()
是异步的。在当前方法 returns 之前,toast 不会显示,即便如此,Android 可能会决定稍后显示它(例如,如果屏幕上已经显示了另一个 toast)甚至完全没有。
你真的需要使用原生的toasts吗?也许最好的办法是使用另一个更可靠的系统。自定义视图出现在看起来像吐司的所有内容之上并且您可以立即可靠地显示怎么样?
我试图在 for 循环之前显示祝酒词,但是,祝酒词没有显示。我也尝试添加一个小吃店,但这也没有用。我想知道为什么吐司不先烧。我什至尝试了以下方法,但它一直在循环:
Toast toast = Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
while (!toast.getView().isShown()) {
toast.show();
}
如何在 for 循环之前显示祝酒词?
ArrayList<String> pizzaBases = new ArrayList<> ();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
main.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
}
});
SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);
for (int i = 0; i < 100; i++) {
try {
String pizza = preferences.getString("TypeOfBase" + i, "");
if (!pizza.equals("")) {
pizzaBases.add(pizza);
}
} catch (NullPointerException e) {
//Do nothing here
}
}
}
});
Button button1 = (Button) findViewById(R.id.buttonOne);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (String myString : pizzaBases) {
System.out.println(myString);
}
}
});
}
我尝试了 runOnUiThread、asynctask 和 while 循环等解决方案,但它们都没有显示 toast 或 snackbar。
编辑:
我发现 UI 仅在 for 循环完成后更新。我想知道为什么它会这样做,尽管它是先激活的。
您没有在这一行调用 show() 方法:
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
应该是:
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();
您不需要使用 runOnUiThread
因为您已经在主线程上并且您没有在第二个代码中对您的 toast 调用 show()
。
最好将最近的 Context
对象传递给你的 toast。
public void onClick(View view) {
Toast.makeText(YourActivity.this, "Hello", Toast.LENGTH_SHORT).show(); // show must be called
Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);
...
}
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);
show toast时必须调用
.show()
方法。如果您在
Activity
中显示Toast
,最好使用Activity
的context
更正
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();
Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
如果您想显示 SnackBar
,则必须提供当前 activity 而非 android.R.id.content
更正
Snackbar.make(findViewById(R.id.parent_of_your_activity), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
你不需要使用
runOnUiThread
因为你已经在主线程上了可以获得
Context
通过
YourActivity.this
或this
在Activity
本身通过
getContext()
在Fragment
class
问题是 Toast.show()
是异步的。在当前方法 returns 之前,toast 不会显示,即便如此,Android 可能会决定稍后显示它(例如,如果屏幕上已经显示了另一个 toast)甚至完全没有。
你真的需要使用原生的toasts吗?也许最好的办法是使用另一个更可靠的系统。自定义视图出现在看起来像吐司的所有内容之上并且您可以立即可靠地显示怎么样?