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