Search code examples
javaandroiddialogcustomdialog

using custom_dialog.dismiss() force closes app


i have just started with android but have done some c# which seems very similar to java

in short, the problem lies in the closeDialog method

I am not very familiar with view/viewgroup so please dont bombard me with incorrect usage of objects, etc.

in short, i am creating a simple app which i hope to improve on (it is basically the start of a huge project)

the _showhint dialog opens fine, and shows the "hint" as expected, but the closeDialog force closes the app, I have no idea why

package com.example.app;

import android.app.Activity;
import android.app.Dialog;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
import android.webkit.ValueCallback;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends ActionBarActivity {

    private WebView webView;
    final Activity activity = this;
    public Uri imageUri;

    private ValueCallback<Uri> mUploadMessage;
    private Uri mCapturedImageImageURI = null;
    private TextView lblAnswer, lblWelcome;
    private EditText edtInput;
    public TextView showText ;
    public Button btnShowHint, btnCalculate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edtInput = (EditText) findViewById(R.id.edtInput) ;
        lblWelcome = (TextView) findViewById(R.id.lblWelcome) ;
        lblAnswer = (TextView) findViewById(R.id.lblAnswer) ;
        btnShowHint = (Button) findViewById(R.id.btnHelp);
        btnCalculate = (Button) findViewById(R.id.btnShow) ;

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }

    public  void calculate(View vw)
    {
        String [] arrEditStore = new String[edtInput.length()] ;
        String arrOperators [] = {"+", "-", "*", "/", "(", ")"} ;


    }

    public void _showhint(View vw)
    {
        final Dialog showHintDialog = new Dialog(activity);

        showHintDialog.setContentView(R.layout.custom_dialog);
        showHintDialog.setTitle("How to enter data");

        showHintDialog.show();
    }

    public void closeDialog(View vw)
    {
        final Dialog dialog = new Dialog(this) ;
        Button btnClose = (Button) dialog.findViewById(R.id.button) ;
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
    }

    @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();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }
    }

}

EDIT: ADDED "this" to final Dialog dialog = new Dialog(this)


Solution

  • I have discovered what has caused the problem

    GIVEN CODE:

    public void _showhint(View vw)
    {
        final Dialog showHintDialog = new Dialog(activity);
    
        showHintDialog.setContentView(R.layout.custom_dialog);
        showHintDialog.setTitle("How to enter data");
    
        showHintDialog.show();
    }
    
    public void closeDialog(View vw)
    {
        final Dialog dialog = new Dialog(this) ;
        Button btnClose = (Button) dialog.findViewById(R.id.button) ;
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
    }
    

    SOULTION

    first, I moved the decleration of the btnClose to the top

    public Button btnShowHint, btnCalculate, btnClose;
    

    then in the design view, removed the link of the button Close onclick method refering to closeDialog.

    Afterwards, removing the closeDialog method completely, and also moving some of that code to the _showHint method

    it also makes logical sense, thanks to @Mike M. who commented on the post, helped me reason it out, since I say, THIS button must close the dialog but in the method of this button, I am assigning it to be used by itself, which doesn't make logical sense at all, here is the changed code and it works

    CHANGED CODE:

    public void _showhint(View vw)
        {
            final Dialog showHintDialog = new Dialog(activity);
    
            showHintDialog.setContentView(R.layout.custom_dialog);
            showHintDialog.setTitle("How to enter data");
    
            showHintDialog.show();
            btnClose = (Button) showHintDialog.findViewById(R.id.button) ;
            btnClose.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    showHintDialog.dismiss();
                }
            });
        }
    

    We all make stupid and unnessasary mistakes at times, some worse than others, but if you find a solution to a problem you have had, maybe somewhere someone has the same issue, so post a solution to your problem, it might help that someone!!!

    cheers