0

ボタンが 18 個あるアプリケーションをセットアップしました。この背後にある基本的な考え方は、これらのボタンのうち 3 つがクリックされると、文字列変数が各ボタンに割り当てられるというものです。次に、値が加算され、文字列と比較されます。文字列の値が一致する場合、警告ダイアログが表示されるようにしたいと思います。各ボタン変数を共有設定に保存しようとしましたが、アラート ダイアログは、そのアクティビティを再開した後にのみ表示されます。私はこれがすぐに起こることを望みます。誰かがこれに光を当てることができれば、私は永遠に感謝します. また、これを行うより効率的な方法が可能であれば、それは役に立ちます。

ボタンなどのブロックの外側の変数を処理するのが難しいかどうかはわかりません。方法を知っていれば、3 つの変数をボタン ブロックの外に渡して同じファイル内で呼び出し、比較してからアラートを設定するだけで済みます。繰り返しますが、基本的なロジックは次のとおりです。特定の 3 つのボタンが選択され、3 つすべてが選択された場合にのみ、警告ダイアログが表示されます。(それが役立つ場合は、他のボタンを選択すると、他のすべてのボタンがリセットされます)。コード:

public class Stage1Level1Activity extends Activity {



/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.stage1level1);



    ImageButton a1 = (ImageButton) findViewById(R.id.a1);
    ImageButton a3 = (ImageButton) findViewById(R.id.a3);
    ImageButton a4 = (ImageButton) findViewById(R.id.a4);
    ImageButton b1 = (ImageButton) findViewById(R.id.b1);
    final ImageButton b2 = (ImageButton) findViewById(R.id.b2);
    ImageButton b3 = (ImageButton) findViewById(R.id.b3);
    ImageButton b4 = (ImageButton) findViewById(R.id.b4);
    ImageButton c1 = (ImageButton) findViewById(R.id.c1);
    final ImageButton c2 = (ImageButton) findViewById(R.id.c2);
    ImageButton c3 = (ImageButton) findViewById(R.id.c3);
    ImageButton c4 = (ImageButton) findViewById(R.id.c4);
    ImageButton d1 = (ImageButton) findViewById(R.id.d1);
    final ImageButton d2 = (ImageButton) findViewById(R.id.d2);
    ImageButton d3 = (ImageButton) findViewById(R.id.d3);
    ImageButton d4 = (ImageButton) findViewById(R.id.d4);
    ImageButton e1 = (ImageButton) findViewById(R.id.e1);
    ImageButton e3 = (ImageButton) findViewById(R.id.e3);
    ImageButton e4 = (ImageButton) findViewById(R.id.e4);



    a1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });


    a3.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    a4.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    b1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });

    b2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_filled);
            SharedPreferences sharedPreferences1 = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences1.edit();
            editor.putString("part1", "a");
            editor.commit();
        }
        });
    b3.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    b4.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    c1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    c2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            c2.setBackgroundResource(R.drawable.green_filled);
            SharedPreferences sharedPreferences2 = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences2.edit();
            editor.putString("part2", "b");
            editor.commit();
        }
        });
    c3.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    c4.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    d1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    d2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            d2.setBackgroundResource(R.drawable.green_filled);
            SharedPreferences sharedPreferences3 = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences3.edit();
            editor.putString("part3", "c");
            editor.commit();
        }
        });
    d3.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    d4.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    e1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });

    e3.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });
    e4.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            b2.setBackgroundResource(R.drawable.green_empty);
            c2.setBackgroundResource(R.drawable.green_empty);
            d2.setBackgroundResource(R.drawable.green_empty);


        }
        });

    SharedPreferences sharedPreferences1 = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
    String part1 = sharedPreferences1.getString("part1", "");
    SharedPreferences sharedPreferences2 = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
    String part2 = sharedPreferences2.getString("part2", "");
    SharedPreferences sharedPreferences3 = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
    String part3 = sharedPreferences3.getString("part3", "");

    String added = part1 + part2 + part3;
    String compared = "abc";

    if (added.equalsIgnoreCase(compared) ){

        AlertDialog alertDialog = new AlertDialog.Builder(Stage1Level1Activity.this).create();
        alertDialog.setTitle("Reset...");
        alertDialog.setMessage("R u sure?");
        alertDialog.setButton2("OK", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {



            } });

        alertDialog.show();
    }





}
}
4

2 に答える 2

0

これらすべてのローカル変数をフィールドとして宣言します。

public class Stage1Level1Activity extends Activity {
   //fields  
   private ImageButton a1;
   ....
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.stage1level1);

      a1 = (ImageButton) findViewById(R.id.a1);
      //
    }
}
于 2012-07-16T03:25:49.597 に答える
0

これらすべてのハンドラーを含む「クラス」で変数を作成すると、それらはすべて変数に直接アクセスできます。

だからこれを試してください:

public class Stage1Level1Activity extends Activity {
    private String myVariable;

その後、定義したこれらのメソッドのいずれかで myVariable にアクセスできるはずです

(編集は続きますが、回答の一部ではありません)問題は、このコードが実際には10〜15行である必要があることです(そして、行が密集していて理解しにくいものでもありません!)。私はGUIツールを持っていないので、あなたのためにそれを行うことはできませんが、例えば、あなたが始めるためだけに非常に最低限のことをします(私の言いたいことがわかるように):

b3.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        b2.setBackgroundResource(R.drawable.green_empty);
        c2.setBackgroundResource(R.drawable.green_empty);
        d2.setBackgroundResource(R.drawable.green_empty);
    }
    });
b4.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        b2.setBackgroundResource(R.drawable.green_empty);
        c2.setBackgroundResource(R.drawable.green_empty);
        d2.setBackgroundResource(R.drawable.green_empty);
    }

次と同等です。

OnClickListener ocLictener=new View.OnClickListener() {
    public void onClick(View view) {
        b2.setBackgroundResource(R.drawable.green_empty);
        c2.setBackgroundResource(R.drawable.green_empty);
        d2.setBackgroundResource(R.drawable.green_empty);
    }
    });
b3.setOnClickListener(ocListener);
b4.setOnClickListener(ocListener);

(正確に同じパターンに従った 2 つを選んだことに注意してください。他にもたくさんあります。

私は批判的であろうとしているわけではありません (そうかもしれませんが、意地悪な意味で言っているのではなく、単に有益なだけです)、これらの方針に沿ってコーディングを続けると、多くの心痛。このクリップ全体を「リファクタリング」SOサイトに投稿して、何が起こるか見てみましょう:)

ところで、問題の一部は GUI ビルダーにあり、彼らはこの種のコードを奨励していますが、それを必要としていません...

編集:実際には、これをそのままにしておくことはできません。少しリファクタリングを試してみましょう:

public class Stage1Level1Activity extends Activity {

/** アクティビティが最初に作成されたときに呼び出されます。*/ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.stage1level1);

// Here we create a bunch of image buttons.  Instead of having he same line repeated
// let's put them into an array.  I forget the type of Android's resources but let's
// assume they are Strings:

// Need to list all the ids somehow, this is probably the easiest.
private String[] ids=new String[]{R.id.a1, R.id.a2, r.id.a3, ..., r.id.e4}  
private String[] triggerIds=new String[]{R.id.b2, R.id.c2, r.id.d2}    
private ImageButton btns=new ImageButton[ids.length];
private ImageButton triggerBtns=new ImageButton[ids.length];

for(int i=0;i<ids.length;i++)
    btns[i]= (ImageButton) findViewById(ids[i]);
for(int i=0;i<triggerIds.length;i++)
    triggerBtns[i]=(ImageButton) findViewById(ids[i]);

// Now you have two types of buttons, the first type are all the same
for(ImageButton ib:btns) {
    ib.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            for(ImageButton tb:triggerBtns) {
                tb.setBackgroundResource(R.drawable.green_empty);
    }
    });
}

int arrayPtr=0;  // Used to fill out some values in the following loop

for(ImageButton tb:triggerBtns) {
    tb.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            tb.setBackgroundResource(R.drawable.green_filled);
            SharedPreferences sharedPreferences1 = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences1.edit();
            // Right here is the only place that these three differ.  The pattern is:
            // editor.putString("part1", "a");
            // editor.putString("part2", "b");
            // editor.putString("part3", "c");
            String[] values=new String[]{"part1", "a", "part2","b","part3","c"};
            editor.putString(values[arrayPtr++], values[arrayPtr++]);
            editor.commit();
        }
    });
// I'll leave it here, that replaces at least 4/5 of the original code and in 20
// or so lines.  A lot more could be done, but the array trick is really handy
// for code like this.
于 2012-07-16T03:41:30.227 に答える