簡體   English   中英

從asynktask在android活動中添加點心欄

[英]add snackbar in android activity from asynktask

main活動中,我稱此為后台過程。 在這種背景下,這里有onprexecute方法, else我需要添加一個Snackbarif else條件

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;
        }
    }

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

不管用。 findViewById是不是AsyncTask的活動類的方法。

使用接口作為回調。

interface Callback {

public void showSnackBar();
}

在AsyncTask中

private Callback callback;

然后

public background (Context ctx){

callback =(Callback) ctx;

然后在onPreExecute

 else {
     if(callback!=null)
      callback.showSnackbar();

    }

在活動類中實現接口和方法

public YourActivity extends AppCompatActivity implements Callback {

然后

@Override
public void showSnackBar()
{
  // show snack bar in activity
}

您也可以使用某些事件總線機制來代替上述機制。

下面顯示了顯示基本SnackBar的代碼段:

Snackbar snackbar = Snackbar
        .make(coordinatorLayout, "www.journaldev.com", Snackbar.LENGTH_LONG);
snackbar.show();

在上面的代碼段中,make()方法接受三個參數:

coordinatorLayout:它是活動的根目錄

www.journaldev.com:這是出現在快餐欄上的消息,我們可以使用自己的消息進行自定義

Snackbar.LENGH_LONG:這是最后一個參數,它是時間限制顯示小吃條多長時間

show()方法用於在屏幕上顯示SnackBar。

這對您有幫助嗎?

您沒有像通過異步類那樣傳遞上下文,而是使用您的活動在該上下文中查找視圖,您無權訪問活動視圖。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM