Alertdialog未显示

时间:2013-07-31 18:57:30

标签: android progressdialog android-alertdialog

我有一个带有EditText和(瞬间2个按钮)的活动。按下Button时,会检查EditText中的数据是否为空或空字符串。如果是这样,应显示AlertDialog。这应该重复,直到TextEdit的结果不为空。 只要我在Activity中没有任何进一步处理,这样就可以正常工作。如果我有进一步的说明,则不会显示Alertdialog。逐步重复显示应用程序进入检查,创建Alertdialog但未显示,而是执行代码中的下一条指令。所以没有意义。应用程序必须在显示Alertdialog的位置停止处理。 一旦收到非空字符串,就应该检查具有各种SQL注入字符串的文本文件,并提出显示测试进度的Progressdialog。如果测试结果为肯定,则应返回EditText以允许更正数据。 到目前为止,所有按钮的行为都是相同的。所以我相信这将是为这些动作创建自己的(内部)类的最佳方法。 进一步的行动(尚未实施)应该是:一个按钮将调用另一个活动,要求手动完成数据,其他活动将尝试从各种互联网资源中获取丢失的数据。并在另一个活动中显示结果,允许选择正确的数据。然后,完整的数据将被发送到数据库。 (针对SQL注入字符串进行测试的一个原因)

以下是代码:

public class BlahverwaltungDateneingabeActivity extends Activity {

    public String vtitel=null;  //Variable, der der Wert des Texteingabefeldes zugewiesen werden soll
    public String vtitel_1 = null; //Variable für Stringmanipulation
    private EditText input_vtitel; //Texteingabefeld
    public static Boolean inject_2=false;
    final Context context_1=this;
    Toast einToast;

//  private String filename=getString(R.string.Tempfile_fuer_Blahdaten); // Temporäres File für Blahdaten


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

        Button manuellButton = (Button) findViewById(R.id.manuell_button);
        Button ofdbButton = (Button) findViewById(R.id.blah_button);


        //OnClicklistener erzeugen

        manuellButton.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View view) {

                input_vtitel = (EditText) findViewById(R.id.Blahtitel); //Texteingabefeld initialisieren
                vtitel = input_vtitel.getText().toString();  //Texteingabe String zuweisen

                if (vtitel.equals(null) || vtitel.equals("")) {
                    AlertDialog.Builder adb_1 = new AlertDialog.Builder(context_1); //Alertdialog wenn Texteingabe leer
                    adb_1.setTitle(R.string.Nullstring); //Alertdialgo Titel setzen
                    adb_1.setMessage(R.string.Nullstring_1); //AlertNachricht setzen
                    adb_1.setCancelable(false); //kann nicht durch Back abgebrochen werden
                    adb_1.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {    //OnClickListener erzeugen
                        public void onClick(DialogInterface dialog, int which) {     //Activity neu starten
                            dialog.dismiss();
                            if (Build.VERSION.SDK_INT >= 11) {     //Methode zum Neustart in Abhängigkeit vom SDK wählen
                                recreate();
                            } else {
                                Intent in_1 = getIntent();
                                overridePendingTransition(0, 0);
                                in_1.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                                finish();

                                overridePendingTransition(0, 0);
                                startActivity(in_1);
                            }

                        }
                    });
                    AlertDialog ad_1 = adb_1.create();     //Alertdialig erzeugen
                    ad_1.show();
                                             //Alertdialog anzeigen
                }
                InjectionDialog id_1= new InjectionDialog(BlahverwaltungDateneingabeActivity.this);
                id_1.execute(vtitel);
                try {
                    inject_2=id_1.get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }


//                vtitel_1 = vtitel.replace(" ", "+"); //Leerzeichen durch "+" ersetzen
/*
                try {
                    outputstream_1 = openFileOutput(filename, Context.MODE_PRIVATE);
                    outputstream_1.write(vtitel.getBytes());
                    outputstream_1.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
*/

            });
        }



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

}

如果您提供帮助,请尽可能地解释,我是Java / Android新手,有时候并不完全了解我在做什么。学习书籍和互联网资源往往没有帮助。我能够采用提供的解决方案,但我也想了解为什么这样做以及代码在做什么。

BTW:正如我上面提到的那样,数据可能会被发送到互联网上,那么怎样才能确保没有html黑客攻击,跨站点脚本java脚本,php攻击代码在数据发送时? aRe还有一些comon字符串我可以检查数据字符串吗?

1 个答案:

答案 0 :(得分:0)

好的,到目前为止还没有人回答我的问题。所以我会尝试自己做。上面的代码示例我已经完全重写并对其进行了大量的逐步调试,以了解Android程序exectuion和变量初始化和赋值的行为。

我现在将解释我到目前为止所理解的内容。如果有任何错误,请纠正我。

这是新代码,仍然没有完成,它仍然包含一些无用的“调试”,有时会导致我添加的无限循环代码,以了解程序exectuion和变量赋值是如何工作的。

public class BlahverwaltungDateneingabeActivity extends Activity implements OnClickListener {

    public String vtitel_1 = null; //Variable für Stringmanipulation
    public static Boolean inject_2=false;
    private Button manuell_Button;
    private Button ofdb_Button;
    Context context_1=BlahverwaltungDateneingabeActivity.this;
    Toast einToast;

//  private String filename=getString(R.string.Tempfile_fuer_Blahdaten); // Temporäres File für Blahdaten


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_blahverwaltung_dateneingabe_1);

        manuell_Button = (Button) findViewById(R.id.manuell_button);
        manuell_Button.setOnClickListener(this);

        ofdb_Button = (Button) findViewById(R.id.ofdb_button);
        ofdb_Button.setOnClickListener(this);

    }

    public void onClick(View v) {
        EditText input_vtitel =(EditText) findViewById(R.id.Blahtitel);

        String vtitel = input_vtitel.getText().toString();

        if (vtitel.length() == 0) {
            new Builder(this)
                    .setTitle(R.string.Nullstring)
                    .setMessage(R.string.NullstringText)
                    .setCancelable(false)
                    .setNeutralButton(R.string.ok, null)
                    .show();
            return;
        } else {
            Builder adb_2 = new Builder(this);
            adb_2.setTitle(R.string.SQLInjectionPruefung)
                 .setCancelable(false)
                 .setIcon(R.drawable.sand_glass_23654_150)
                 .setNeutralButton(R.string.ok, null);
            AlertDialog ad_2 = adb_2.create();
            ad_2.show();
            Button okButton = ad_2.getButton(AlertDialog.BUTTON_NEUTRAL);
            okButton.setEnabled(false);
            inject_2=InjectionCheck.InjectionCheckResult(context_1, vtitel);
            okButton.setEnabled(true);
            okButton.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v_1) {
                    Toast.makeText(VideoverwaltungDateneingabeActivity.this, "testtest", Toast.LENGTH_LONG).show();
                }
            });
            Toast.makeText(this, "testtesttest", Toast.LENGTH_LONG).show();
            if (inject_2) {
                okButton.performClick();
                new Builder(this)
                        .setTitle(R.string.SQLInjectionResult)
                        .setMessage(R.string.SQLInjectionResultText)
                        .setCancelable(false)
                        .setNeutralButton(R.string.ok, null)
                        .show();
                return;
            }
        }
        Toast.makeText(this, "test", Toast.LENGTH_LONG).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.menu_blahverwaltung_dateneingabe, menu);
        return true;
    }

}

首先,我现在正在将OnClicklistener实现到我的Activity中。

 public class BlahverwaltungDateneingabeActivity extends Activity implements OnClickListener {

优点:我不需要为每个Button创建一个新的OnClickListener实例。

第二次更改,我有一个独立于按钮的按钮方法。 优点:所有可以放在这里的所有Activity buttnos的代码。点击哪个按钮并不重要,此方法中的代码是为所有活动按钮执行的。

稍后我只需要检查点击了哪个按钮,如果(v == manuell_Button)...并且可以将按钮特定代码放在那里。 (我希望这会奏效)

好的,现在假设您没有在EditText字段中输入任何内容并单击按钮。现在会发生什么?

程序exectutes

String vtitel = input_vtitel.getText().toString();

将导致“”空字符串。

接下来它将进入

if (vtitel.length() == 0)

因为我们有一个长度为0的空字符串,所以执行那里的指令。

new Builder(this)
        .setTitle(R.string.Nullstring)
        .setMessage(R.string.NullstringText)
        .setCancelable(false)
        .setNeutralButton(R.string.ok, null)
        .show();
return;

此代码似乎是在块中执行的。虽然我在返回指令上设置了断点但它从未停止过。 它还没有显示AlerDialog,而是跳转到OnClick方法的末尾。然后它调用view.java,而不显示对话框,然后处理handler.java - 仍然没有显示对话框,最后是looper.java,这里显示对话框。 因为我没有为对话框按钮实现OnClicklstener,单击该按钮将关闭对话框而不进一步操作并返回到Activity。

现在假设您在TextEdit字段中输入了一些内容。 然后程序将进入“if(vtitel.length()== 0)”指令的“else”树。它将从树中执行所有适当的步骤,而不显示Alertdialog,然后从Activity中的其余代码执行任何适当的操作,然后再次调用view.java,handler.java和looper.java,然后再显示对话框。

这使得几乎不可能创建这样的行为:

  1. 提出对话
  2. 停止程序执行并等待用户操作
  3. 根据用户响应执行更多代码
  4. 在我的代码中,针对具有注入字符串的文件检查用户输入。我的初衷是在执行检查时显示对话框,然后根据检查结果自动关闭对话框并继续执行程序。 我的文件很小,并没有造成太大的延迟,所以我尝试添加Thread.sleep()指令或将检查放入for循环并让它运行100次。结果与显示AlertDialog之前 之前的结果相同无关紧要。所以在这种情况下,AlertDialog是无用的。 另一种可能性是ProgressDialog,但在这里我有类似的问题。 ProgressDialog独立于Activity运行,意味着当Progressdialog运行时,Activity执行进一步的操作。但是Activity需要Progressdialog的结果。第二个问题,没有简单的方法将Progressdialog的结果传递回Activity.ProgressDialog.get()方法有效但也阻止了ProgressDialog的显示.OnPostExecute方法也不可用,似乎不是旨在将任何结果传递回Activity,尽管它是在Activity线程中执行的。我现在卡在这里。它看起来没有简单的方法来实现我想要的行为,我必须找到处理Android程序行为的方法,而不会失去我想要的大部分功能。