首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从asynktask在android活动中添加snackbar

从asynktask在android活动中添加snackbar
EN

Stack Overflow用户
提问于 2017-05-30 15:03:42
回答 3查看 850关注 0票数 0

main活动中,我将此后台进程称为后台进程。在这个背景下,有一个onprexecute方法,在else部件中有一个if else条件,我需要添加一个Snackbar

代码语言:javascript
运行
复制
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;
        }
    }
EN

回答 3

Stack Overflow用户

发布于 2017-05-30 15:10:43

Snackbar.make(this.findViewById(android.R.id.content), "Message", Snackbar.LENGTH_LONG).show();

不会起作用。findViewById是activity类的方法,而不是AsyncTask的方法。

使用接口作为回调。

代码语言:javascript
运行
复制
interface Callback {

public void showSnackBar();
}

在AsyncTask中

代码语言:javascript
运行
复制
private Callback callback;

然后

代码语言:javascript
运行
复制
public background (Context ctx){

callback =(Callback) ctx;

然后在onPreExecute中

代码语言:javascript
运行
复制
 else {
     if(callback!=null)
      callback.showSnackbar();

    }

在activity类中实现接口和方法

代码语言:javascript
运行
复制
public YourActivity extends AppCompatActivity implements Callback {

然后

代码语言:javascript
运行
复制
@Override
public void showSnackBar()
{
  // show snack bar in activity
}

您也可以使用一些事件总线机制来代替上面的机制。

票数 1
EN

Stack Overflow用户

发布于 2017-05-30 15:18:26

当您在异步类中时,您没有使用您活动传递上下文来查找上下文中的视图,您没有访问您的活动视图的权限。

代码语言:javascript
运行
复制
 Snackbar.make(MainActivity.this.findViewById(android.R.id.content), "Message", Snackbar.LENGTH_LONG).show();
票数 1
EN

Stack Overflow用户

发布于 2017-05-30 15:10:00

显示基本SnackBar的代码片段如下所示:

代码语言:javascript
运行
复制
Snackbar snackbar = Snackbar
        .make(coordinatorLayout, "www.journaldev.com", Snackbar.LENGTH_LONG);
snackbar.show();

在上面的代码片段中,make()方法接受三个参数:

coordinatorLayout :它是活动的根布局

www.journaldev.com :这是将出现在快餐栏上的消息,我们可以使用自己的消息对其进行自定义

Snackbar.LENGH_LONG :这是最后一个参数,它是显示snackbar的时间限制

show()方法用于在屏幕上显示SnackBar。

这对你有帮助吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44255645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档