2

私は方法を持っています:

void someMethod(String someString)
    final String[] testAgainst = {...};
    ....
    for(int i = 0; i < testAgainst.length; i++) {
        if (someString.equals(testAgainst[i])) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Strings are the same! Overwrite?")
                   .setTitle("Blah Blah Blah")
                   .setCancelable(false)
                   .setPositiveButton("Overwrite", new DialogInterface.OnClickListener() {

                       public void onClick(DialogInterface di, int which) {
                           someAction()
                       }
                   })

                   .setNegativeButton("Nah", new DialogInterface.OnClickListener() {

                       public void onClick(DialogInterface di, int which) {
                           ESCAPE
                       }
                   });
            AlertDialog dialog = builder.create();
        }
    }

    doSomeOtherStuff();
}

私のコードが到達した場合ESCAPE(つまり、ユーザーが上書きしないことを決定した場合) は、メソッドを完全に終了したいと考えています。私が試してみました...

  • ブール値を返すように変更someMethod()し、負のボタンからそれを返しますが、無効な内部メソッド内にあるため、許可されません。
  • から例外をスローしてESCAPE外部でキャッチしますが、コンパイラは例外をDialogInterface.OnClickListenerスローしないため許可しません。
  • breakステートメントを使用してforループを終了しますが、それも機能しません。

for単にループを離れることも許容されます。私はそれを説明することができます。私は見つけることができるすべてを試しましたが、私は機知に富んでいます。

4

3 に答える 3

3

RuntimeException またはそのサブクラスの 1 つをスローできます。コンパイラはそれについて不平を言うことはありません。

于 2012-03-13T04:32:17.417 に答える
1

次の方法でコードを強化できます。

// Static class that contains nothing but a trigger to exit the loop
static class Cancel { boolean shouldCancel = false; }

void someMethod(String someString)
    final String[] testAgainst = {...};
    ....

    // Initialize it `final`, else it won't be accessible inside
    final Cancel trigger = new Cancel();

    // Add the check as additional condition for the `for` condition
    for(int i = 0; i < testAgainst.length && !trigger.shouldCancel; i++) {
        if (someString.equals(testAgainst[i])) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Strings are the same! Overwrite?")
                   .setTitle("Blah Blah Blah")
                   .setCancelable(false)
                   .setPositiveButton("Overwrite", new DialogInterface.OnClickListener() {

                       public void onClick(DialogInterface di, int which) {
                           someAction()
                       }

                   .setNegativeButton("Nah", new DialongInterface.OnClickListener() {

                       public void onClick(DialogInterface di, int which) {
                           // Use the trigger to communicate back that it's time to finish
                           trigger.shouldCancel = true;
                       }
            AlertDialog dialog = builder.create();
        }
    }

    doSomeOtherStuff();
}

Android には、ハンドラーなどの他の方法もあります。

于 2012-03-13T04:33:25.183 に答える
1

そのメソッドが実行されるとき、あなたはループに入っていません。そこで宣言された変数にアクセスできる場合がありますが (それらが final の場合)、OnClickListener はクリックすると実行され、完全にそのループの外/ループから削除されます。

于 2012-03-13T04:35:09.897 に答える