0

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

这是代码:

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 hacking,cross site scripting java script,php攻击代码?a还有一些我可以检查数据字符串的常用字符串吗?

4

1 回答 1

0

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

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

这是新代码,仍然不完整,它仍然包含一些无用的“调试”,有时会导致无限循环代码我添加以了解程序执行和变量分配的工作原理。

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 {

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

第二个变化,我有一个独立于按钮的 OnClick 方法。优点:我可以放在这里的所有 Activity buttnos 的所有代码都是相同的。单击哪个按钮无关紧要,此方法中的代码会针对所有Activity 按钮执行。

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

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

程序执行

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. 根据用户响应执行进一步的代码

在我的代码中,根据带有注入字符串的文件检查用户输入。我的初衷是并且是在执行检查时显示一个对话框,然后根据检查结果自动关闭对话框并继续执行程序。我的文件很小,不会造成太多延迟,因此我尝试添加 Thread.sleep() 指令或将检查放入 for 循环并让它运行 100 次。结果与之前执行的指令相同并不重要显示警报对话框。所以在这种情况下,AlertDialog 是没有用的。另一种可能性是 ProgressDialog 但在这里我有类似的问题。ProgressDialog 独立于 Activity 运行,这意味着当 Progressdialog 运行时,Activity 会执行进一步的操作。但是 Activity 需要 Progressdialog 的结果。第二个问题,没有简单的方法可以将 ProgressDialog 的结果传回 Activity。ProgressDialog.get() 方法有效但也阻止了 ProgressDialog 显示。OnPostExecute 方法也不可用,似乎不是旨在将任何结果传递回活动,尽管它是在活动线程中执行的。我现在被困在这里。

于 2013-08-04T16:59:09.423 回答