为什么 Android Toast 没有显示?
Why Android Toast is not showing?
我在获取Toast
时遇到问题
public class LiveMatch extends Fragment {
private List<Items_list> matches;
private static final String URL="https://www.cricbuzz.com/match-api/livematches.json";
private String recent_match;
View v;
public LiveMatch() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
v = inflater.inflate(R.layout.live, container, false);
return v;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
matches = new ArrayList<>();
final StringRequest stringRequest = new StringRequest(Request.Method.GET, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray live_match = new JSONArray(response);
Toast.makeText(v.getContext(),live_match.length(),Toast.LENGTH_LONG).show();
for (int i = 0; i < live_match.length(); i++) {
JSONObject object = live_match.getJSONObject(i);
recent_match = object.getString("mathes");
RecyclerView recyclerView = v.findViewById(R.id.recycl);
RecylerAddapter recylerAddapter = new RecylerAddapter(getContext(), matches);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(recylerAddapter);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(v.getContext(), error.toString(), Toast.LENGTH_SHORT).show();
}
});
Volley.newRequestQueue(Objects.requireNonNull(getContext())).add(stringRequest);
}
}
您必须在片段中使用 getActivity()
或 getContext()
来获取默认上下文并使用它。
如此干净 v.getContext()
并调用上述方法之一
ToastmakeText
方法重载,可以通过资源ID加载
makeText(Context context, int resId, int duration)
或传递文本显示
makeText(Context context, CharSequence text, int duration)
如果您用整数加载它 live_match.length()
Android 尝试加载所需的资源,但找不到它,因此不会显示 Toast。要达到您的目标,您必须将该整数转换为字符串(实际上是 CharSequence),如评论中所述。
Toast.makeText(getActivity(), String.valueOf(live_match.length()), Toast.LENGTH_LONG).show();
如果这不起作用,请确保您可以从那里接触主线程,我认为您是在不允许接触用户界面的后台线程中加载 Toast
问题出在解析 JSON 响应中。
Web 服务 (API) 响应来自 JSON 对象,您正在 JSON 数组中处理它。
查看 Livestream URL
的回复
更正您处理响应的代码,它将起作用。
请注意,您必须通过使用 Iterator 迭代循环来获取值,因为匹配对象包含 JSONObjects.
如下更新您的 onResponse 方法:
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
Log.e("Response: ", jsonObject.toString());
JSONObject objMatch = jsonObject.optJSONObject("matches");
Iterator<String> iterator = objMatch.keys();
int counter = 0;
while (iterator.hasNext()) {
String key = iterator.next();
try {
JSONObject value = objMatch.getJSONObject(key);
Log.e("Value: ", value.toString());
// Here you have to add values in Items_list and then after add it in matches list
counter++;
} catch (JSONException e) {
// Something went wrong!
}
}
Toast.makeText(getActivity(), "Total Records: " + counter, Toast.LENGTH_LONG).show();
// After competition of iterator loop, you have to set that List in RecyclerView Adapter here
} catch (JSONException e) {
e.printStackTrace();
}
}
Toasts只能在主线程等looper线程上显示。我的猜测是 Volley 运行 在工作线程上的回调。
从主线程显示你的 toast:
getActivity().runOnUiThread({
Toast.makeText(...).show()
})
我正在使用 Java 8 lambda 表示法,但您可以将其调整为 Runnable
。
话虽如此,请同时阅读所有其他答案。
我在获取Toast
public class LiveMatch extends Fragment {
private List<Items_list> matches;
private static final String URL="https://www.cricbuzz.com/match-api/livematches.json";
private String recent_match;
View v;
public LiveMatch() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
v = inflater.inflate(R.layout.live, container, false);
return v;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
matches = new ArrayList<>();
final StringRequest stringRequest = new StringRequest(Request.Method.GET, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray live_match = new JSONArray(response);
Toast.makeText(v.getContext(),live_match.length(),Toast.LENGTH_LONG).show();
for (int i = 0; i < live_match.length(); i++) {
JSONObject object = live_match.getJSONObject(i);
recent_match = object.getString("mathes");
RecyclerView recyclerView = v.findViewById(R.id.recycl);
RecylerAddapter recylerAddapter = new RecylerAddapter(getContext(), matches);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(recylerAddapter);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(v.getContext(), error.toString(), Toast.LENGTH_SHORT).show();
}
});
Volley.newRequestQueue(Objects.requireNonNull(getContext())).add(stringRequest);
}
}
您必须在片段中使用 getActivity()
或 getContext()
来获取默认上下文并使用它。
如此干净 v.getContext()
并调用上述方法之一
ToastmakeText
方法重载,可以通过资源ID加载
makeText(Context context, int resId, int duration)
或传递文本显示
makeText(Context context, CharSequence text, int duration)
如果您用整数加载它 live_match.length()
Android 尝试加载所需的资源,但找不到它,因此不会显示 Toast。要达到您的目标,您必须将该整数转换为字符串(实际上是 CharSequence),如评论中所述。
Toast.makeText(getActivity(), String.valueOf(live_match.length()), Toast.LENGTH_LONG).show();
如果这不起作用,请确保您可以从那里接触主线程,我认为您是在不允许接触用户界面的后台线程中加载 Toast
问题出在解析 JSON 响应中。
Web 服务 (API) 响应来自 JSON 对象,您正在 JSON 数组中处理它。
查看 Livestream URL
更正您处理响应的代码,它将起作用。
请注意,您必须通过使用 Iterator 迭代循环来获取值,因为匹配对象包含 JSONObjects.
如下更新您的 onResponse 方法:
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
Log.e("Response: ", jsonObject.toString());
JSONObject objMatch = jsonObject.optJSONObject("matches");
Iterator<String> iterator = objMatch.keys();
int counter = 0;
while (iterator.hasNext()) {
String key = iterator.next();
try {
JSONObject value = objMatch.getJSONObject(key);
Log.e("Value: ", value.toString());
// Here you have to add values in Items_list and then after add it in matches list
counter++;
} catch (JSONException e) {
// Something went wrong!
}
}
Toast.makeText(getActivity(), "Total Records: " + counter, Toast.LENGTH_LONG).show();
// After competition of iterator loop, you have to set that List in RecyclerView Adapter here
} catch (JSONException e) {
e.printStackTrace();
}
}
Toasts只能在主线程等looper线程上显示。我的猜测是 Volley 运行 在工作线程上的回调。
从主线程显示你的 toast:
getActivity().runOnUiThread({
Toast.makeText(...).show()
})
我正在使用 Java 8 lambda 表示法,但您可以将其调整为 Runnable
。
话虽如此,请同时阅读所有其他答案。