警报对话框的共享首选项使我的应用程序无响应

时间:2013-09-13 23:10:52

标签: android

我这里有一些常见的问题。我有一个alertdialog,一旦我的应用程序启动就会启动,一旦用户单击确定按钮,该对话框将永远不再显示,除非它已被删除并再次安装。当我第一次在我的模拟器上尝试它时它起作用,并且第一次我的意思是,当我完成为alertdialog的共享首选项编写代码时,我很快启动应用程序。但是当我关闭模拟器并再次启动我的应用程序时,alertdialog不显示,我的应用程序也没有响应任何内容。我不知道以前是否发生过这种情况,我不知道是否会发生这种情况。有人可以帮我理解发生了什么以及为什么应用程序在第一次启动应用程序后没有响应任何内容。此外,我的logcat也没有显示任何错误。

public class MainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        final SharedPreferences settings = getSharedPreferences("pref_name", 0);
        boolean installed = settings.getBoolean("installed", false);

        if(!installed){

            final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

            alertDialog.setTitle("Title");
            alertDialog.setIcon(R.drawable.ic_launcher);
            alertDialog.setAdapter(new MyAdapter(), null);

            alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putBoolean("installed", true);
                    editor.commit();

                }
            });

            alertDialog.show();

            final EditText et = (EditText) findViewById(R.id.editText1);
            Button getAnswer = (Button) findViewById(R.id.button1);
            getAnswer.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {       
                    if (et.getText().toString().length()==0) {
                        Toast.makeText(getApplicationContext(),"Can't Be Blank!",Toast.LENGTH_LONG).show();             

                    }else{
                        EditText et = (EditText) findViewById(R.id.editText1);
                        String searchTerm = et.getText().toString().trim();         
                        Intent in = new Intent(MainActivity.this, ListView.class);
                        in.putExtra("TAG_SEARCH", searchTerm);
                        startActivity(in);
                    }

                }
            });
        }
     }


    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }}

3 个答案:

答案 0 :(得分:1)

您需要移动此代码

 final EditText et = (EditText) findViewById(R.id.editText1);
        Button getAnswer = (Button) findViewById(R.id.button1);
        getAnswer.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {       
                if (et.getText().toString().length()==0) {
                    Toast.makeText(getApplicationContext(),"Can't Be Blank!",Toast.LENGTH_LONG).show();             

                }else{
                    EditText et = (EditText) findViewById(R.id.editText1);
                    String searchTerm = et.getText().toString().trim();         
                    Intent in = new Intent(MainActivity.this, ListView.class);
                    in.putExtra("TAG_SEARCH", searchTerm);
                    startActivity(in);
                }

            }
        });
    }

代码的if部分。正如Shobhit所说,下次运行你的应用程序时,这永远不会运行。它仅在installedfalse时运行,在第一次运行后永远不会为真。

编辑 - 使用Dialog

避免窗口泄漏错误

您始终可以检查Dialog是否以dialog.isShowing()打开,如果在销毁活动之前返回true,或者某个(另一个Activity)出现在顶部,则关闭对话框。您可以在onPause()中执行此操作。

@Override
public void onPause()
{
    if (dialog != null && dialog.isShowing())
    {    
         dialog.dismiss();    
         super.onPause();
    }
}

答案 1 :(得分:0)

将此代码移动到AsyncTask中。在onCreate()中做任何工作都不是好习惯。 OnCreate()仅用于创建Activity。在OnResume()中启动AsyncTask看看这个activity-life-cycle这是AsyncTask

 final SharedPreferences settings = getSharedPreferences("pref_name", 0);
 boolean installed = settings.getBoolean("installed", false);

if(!installed){

final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

alertDialog.setTitle("Title");
alertDialog.setIcon(R.drawable.ic_launcher);
alertDialog.setAdapter(new MyAdapter(), null);

alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int which) {
           SharedPreferences.Editor editor = settings.edit();
           editor.putBoolean("installed", true);
           editor.commit();

    }
 });

alertDialog.show();

答案 2 :(得分:0)

您拥有的内容如下:

if(!installed){
    // Show dialog 
    // Else Everything inside it
}

当您的应用首次启动时,它会进入循环并显示对话框。下次重新启动时,SharedPreference的值为true,因此它不会进入循环内部,也不会发生任何事情。重新启动手机/模拟器ShraredPreference时不会删除,所以仍然是,并且不会进入循环,所以没有任何反应。

如果你清楚地对你的程序进行缩进,那么它可能会以更好的方式显示出来。