2013-07-31 92 views
0

我有一個EditText和(瞬間2按鈕)的活動。當按下按鈕時,來自EditText的數據將被檢查爲空或空字符串。如果是的話應該顯示AlertDialog。這應該重複,直到TextEdit的結果不是空的。 只要我沒有任何活動中的進一步處理,這工作正常。如果我有進一步的隱患,則不會顯示Alertdialog。一步一步dubugging顯示申請進入檢查,創建Alertdialog但它沒有顯示,而是執行代碼中的下一條指令。所以這沒有意義。應用程序必須在顯示Alertdialog的位置停止處理。 一旦收到一個非空字符串,就應該針對具有各種SQL注入字符串的文本文件進行檢查,並提出一個顯示測試進度的Progressdialog。如果測試結果爲肯定,它應返回到EditText以允許更正數據。 到目前爲止,所有按鈕的行爲都是相同的。所以我相信這將是爲這些行爲創建一個自己的(內部)類的最佳方式。 進一步的行動(尚未實施)應該是:一個按鈕然後會調用另一個活動,要求手動完成數據,其他活動將嘗試從各種互聯網資源中獲取缺失的數據。並在另一項活動中顯示結果,以便選擇正確的數據。完整的數據將被髮送到數據庫。 (針對SQL注入字符串測試的原因之一)Alertdialog沒有顯示

下面是代碼:

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的新手,有時真的不充分理解我在做什麼。學習書籍和互聯網資源通常不會有幫助。我能夠採用提供的解決方案,但我也想明白爲什麼這樣做,代碼在做什麼。

順便說一句:正如我上面提到的數據可能發送到interent,那麼如何確保沒有html黑客入侵,跨腳本腳本的java腳本,php攻擊代碼是否在數據發送時? aRe還有一些comon字符串,我可以檢查數據字符串?

回答

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 { 

優點:我不需要爲每個Button創建一個OnClickListener的新實例。

第二次更改,我有一個按鈕獨立的OnClick方法。 優點:所有活動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,所以單擊此按鈕將會關閉對話框而無需進一步操作並返回到活動。

現在讓我們假設你在TextEdit字段中輸入了一些東西。 然後程序將進入「if(vtitel.length()== 0)」指令的「else」樹。它會執行全部從樹中的適當步驟而不顯示Alertdialog,然後從Activity中剩餘的代碼執行任何適當的操作,然後在顯示對話框之前再次調用view.java,handler.java和looper.java。

這使得它幾乎不可能創造這樣的行爲:

  1. 引發一個對話框
  2. 停止程序執行,並等待用戶操作
  3. 執行取決於用戶響應進一步代碼

在我的代碼中,用注入字符串的文件檢查用戶輸入。我的初衷是在執行檢查時顯示對話框,然後根據檢查結果自動關閉對話框並繼續執行程序。 我的文件很小,不會造成很多延遲,所以我嘗試添加一個Thread.sleep()指令或將檢查放入for循環並讓它運行100次。結果是一樣的,執行指令之前顯示AlertDialog。所以在這種情況下AlertDialog是沒用的。 另一種可能性是ProgressDialog,但在這裏我有類似的問題。 ProgressDialog獨立於Activity運行,意味着當Progressdialog運行時,Activity執行進一步的操作。但該活動需要Progressdialog的結果。第二個問題是,沒有簡單的方法將Progressdialog的結果傳遞迴Activity。ProgressDialog.get()方法可以工作,但也阻止顯示ProgressDialog。OnPostExecute方法也不可用,看起來它不是旨在將任何結果傳遞迴Activity,儘管它在Activity線程中執行。在這裏,我困在當下。看起來有沒有簡單的方法來實現我想要的行爲,我必須找到方法來處理Android程序的行爲,而不會失去我想要的許多功能。