从 asynctask 在 android 活动中添加小吃吧
Posted
技术标签:
【中文标题】从 asynctask 在 android 活动中添加小吃吧【英文标题】:add snackbar in android activity from asynktask 【发布时间】:2017-10-30 12:56:37 【问题描述】:从main
活动我称之为后台进程。这里在这个背景下有onprexecute
方法在else
部分有一个if else
条件我需要添加一个Snackbar
public class background extends AsyncTask<String,Void,String>
private ProgressDialog dialog;
private ProgressDialog progressDialog;
private ConnectivityManager cm;
private String jsonurl, jsonstring;
public static String listRequest;
private mobile_form mform;
private Context ctx;
ProgressBar progressbar;
background (Context ctx)
this.ctx = ctx;
cm = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
dialog = new ProgressDialog(ctx);
progressbar = new ProgressBar(ctx);
progressbar.getIndeterminateDrawable().setColorFilter(Color.parseColor("#039BE5"), android.graphics.PorterDuff.Mode.SRC_IN);
mform = new mobile_form();
@Override
protected void onPreExecute()
super.onPreExecute();
jsonurl = "https://crackstrickblog.000webhostapp.com/json_get_data.php";
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
if (isConnected)
dialog.setCancelable(false);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
dialog.show();
dialog.setContentView(progressbar);
else
// here i need to add snackbar like this
//Snackbar.make(this.findViewById(android.R.id.content), "Message", Snackbar.LENGTH_LONG).show();
@Override
protected void onProgressUpdate(Void... values)
super.onProgressUpdate(values);
@Override
protected void onPostExecute(String result)
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
if (isConnected)
ctx.startActivity(new Intent(ctx, mobile_form.class));
if (dialog.isShowing())
dialog.dismiss();
@Override
protected String doInBackground(String... voids)
return null;
【问题讨论】:
然后添加,有什么问题? here in this.findViewById(android.R.id.content) 它显示 findViewById 无法解析方法 findViewById(int) 没错,因为 AsyncTask 没有这样的方法。例如,您需要以与使用 Context 相同的方式在构造函数参数中传递 View,并在 Snackbar 中使用它。 你能告诉如何通过吗background (Context ctx)
-> background (Context ctx, View view)
。然后将视图存储到一个字段中,并在 Snackbar 中传递:Snackbar.make(view, "Message", Snackbar.LENGTH_LONG).show();
【参考方案1】:
这个Snackbar.make(this.findViewById(android.R.id.content), "Message", Snackbar.LENGTH_LONG).show();
不会工作。 findViewById
是不属于AsyncTask
的活动类方法。
使用接口作为回调。
interface Callback
public void showSnackBar();
在异步任务中
private Callback callback;
然后
public background (Context ctx)
callback =(Callback) ctx;
然后在onPreExecute中
else
if(callback!=null)
callback.showSnackbar();
在activity类中实现接口和方法
public YourActivity extends AppCompatActivity implements Callback
然后
@Override
public void showSnackBar()
// show snack bar in activity
你也可以使用一些事件总线机制来代替上面的。
【讨论】:
【参考方案2】:您没有传递上下文,使用您的活动在该上下文中查找视图,因为您在异步类中,您无权访问您的活动视图。
Snackbar.make(MainActivity.this.findViewById(android.R.id.content), "Message", Snackbar.LENGTH_LONG).show();
【讨论】:
MainActivity 不是封闭类 在 ID 为content
的视图所在的位置使用适当的活动或片段。
我在主要活动和适当的活动中需要它
所以你应该在你的Main
活动layout.xml
文件中有一个id为content
的视图,如果你没有得到它,请在此处添加你的xml代码。【参考方案3】:
显示基本 SnackBar 的代码 sn-p 如下所示:
Snackbar snackbar = Snackbar
.make(coordinatorLayout, "www.journaldev.com", Snackbar.LENGTH_LONG);
snackbar.show();
在上面的sn -p make()方法中接受三个参数:
coordinatorLayout : 活动的根布局
www.journaldev.com : 这是要在snackbar上显示的消息,我们可以用我们自己的消息自定义它
Snackbar.LENGH_LONG :这是最后一个参数,它是显示小吃条的时间限制
show() 方法用于在屏幕上显示 SnackBar。
这对你有帮助吗?
【讨论】:
这是一个重复的问题。 [这里] (***.com/questions/33206181/…) 我的 gradle 已编译 'com.android.support:design:25.2.0' 现在仍然显示相同 你能试试这个文档androidauthority.com/… 或许它可以帮助你检查失败的地方。 @Raghunandan 的回答似乎也得到了很好的解释。以上是关于从 asynctask 在 android 活动中添加小吃吧的主要内容,如果未能解决你的问题,请参考以下文章
如何将变量从 AsyncTask 返回到 Android 中的 Google Map 活动
在 Android 的 AsyncTask 期间更改活动是不是被认为是不好的做法?
android 从扩展 AsyncTask 创建一个对象并将其发送到另一个活动