【问题标题】:add snackbar in android activity from asynktask从 asynctask 在 android 活动中添加小吃吧
【发布时间】: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();

标签: java android android-activity android-asynctask


【解决方案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。

    这对你有帮助吗?

    【讨论】:

    • 这是一个重复的问题。 [这里] (stackoverflow.com/questions/33206181/…)
    • 我的 gradle 已编译 'com.android.support:design:25.2.0' 现在仍然显示相同
    • 你能试试这个文档androidauthority.com/… 或许它可以帮助你检查失败的地方。 @Raghunandan 的回答似乎也得到了很好的解释。
    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 2020-09-07
    • 2018-07-03
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2020-02-20
    • 2020-10-18
    相关资源
    最近更新 更多