Как решить мою проблему NullPointerException в моем Android

Я создал приложение для Android с помощью WebView

Функциональность работает нормально, но когда я добавляю частную пустоту createDialog () для отображения alerttdialog, тогда возникает эта ошибка:

NullPointerException: Attempt to invoke virtual method 'void android.app.Dialog.show()'

по ссылке на нулевой объект в Logcat

Вот мой код фрагмента:

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    public Dialog mDialog;
    public Button mDialogyes, mDialogno;

    ProgressBar progressBar;
    WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        webView=(WebView) findViewById(R.id.webView);

        webView.setVisibility(View.INVISIBLE);
        webView.loadUrl("http://m.jazz.com.pk/smart/wifi_3g.html");
        WebSettings webSettings=webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient());

        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                setProgressBarVisibility(View.VISIBLE);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                setProgressBarVisibility(View.GONE);
                webView.setVisibility(View.VISIBLE);
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                setProgressBarVisibility(View.GONE);
            }
        });
        webView.loadUrl("http://m.jazz.com.pk/smart/wifi_3g.html");


        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setItemIconTintList(null);
        navigationView.setNavigationItemSelectedListener(this);

        ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activenetnetwork = cm.getActiveNetworkInfo();
        if (activenetnetwork != null)
        {
            if (activenetnetwork.getType() == ConnectivityManager.TYPE_WIFI)
            {
                //Toast.makeText(getApplicationContext(),activenetnetwork.getTypeName(),Toast.LENGTH_LONG).show();
            }else if (activenetnetwork.getType() == ConnectivityManager.TYPE_MOBILE)
            {
                //Toast.makeText(getApplicationContext(),activenetnetwork.getTypeName(),Toast.LENGTH_LONG).show();
            }
        }else {

            ActionBar actionBar =  getSupportActionBar();
            actionBar.setTitle("Web page not available");
            Toast.makeText(getApplicationContext(),"Please Check your Internet ",Toast.LENGTH_LONG).show();
        }


    }

    private void setProgressBarVisibility(int visibility) {
        // If a user returns back, a NPE may occur if WebView is still loading a page and then tries to hide a ProgressBar.
        if (progressBar != null) {
            progressBar.setVisibility(visibility);
        }
    }

    private void createDialog() {
        mDialog = new Dialog(this);
        mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        mDialog.setContentView(R.layout.dialog_exit);
        mDialog.setCanceledOnTouchOutside(true);
        mDialog.setCancelable(true);
        mDialogyes = (Button) mDialog.findViewById(R.id.yes);
        mDialogno = (Button) mDialog.findViewById(R.id.no);



        mDialogyes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.addCategory(Intent.CATEGORY_HOME);
                startActivity(intent);
                finish();
                System.exit(0);


            }

        });

        mDialogno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDialog.dismiss();
            }
        });


    }
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            mDialog.show();
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.home) {


        } else if (id == R.id.contact) {

        } else if (id == R.id.about) {

        } else if (id == R.id.share) {

        } else if (id == R.id.rate) {

        } else if (id == R.id.more) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}
0
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Глядя на ваш код, метод createDialog() никогда не вызывается, поэтому значение mDialog всегда равно нулю. Вам необходимо инициализировать диалог (т.е. вызвать createDialog()), прежде чем вы сможете вызвать mDialog.show(); в вашем переопределении onBackPressed().

Перед вызовом метода show требуется проверка нулевого указателя. Пример:

if (mDialog != null) {
    mDialog.show(); 
}

Как отмечалось выше, ваш mDialog имеет значение null, потому что вам нужно сначала вызвать метод createDialog. Какой бы код вы ни скопировали из другого приложения, что-то упускает.

Другие вопросы по теме