1

私はいくつかのボタンを持っています、そしてそれらのそれぞれをクリックすると、ボタンは次のことをします:

public TextView CurrentPosW(){

    TextView wordletters[] = {wordLetter1, wordLetter2, wordLetter3,
            wordLetter4, wordLetter5, wordLetter6, wordLetter7};

    TextView currentPos = null;
    for(int i=0; i<wordletters.length; i++){
    if(!wordletters[i].getText().toString().equals(("*")) && wordletters[i].getText().toString().equals("")){       
        currentPos = wordletters[i];
        return currentPos;
        }
    }
    return null;

CurrentPos()メソッドは、7つの異なるテキストビューをチェックし、呼び出されるたびにテキストを最初の空のテキストビューに設定し、7つのボタンすべてから呼び出されます。また、一部のボタンには同じテキストが含まれている場合があります。テキストビューをクリックして、このテキストビューのアクションを元に戻せるようにしたいと思います。上記の5番目のボタンが3番目のテキストビューのテキストを設定したとしましょう。したがって、このテキストビューがクリックされたときに、次の操作を実行します。-ボタンを再設定可能-もう一度クリック可能に設定-このテキストビューのテキストを空にする基本的に、ボタンのアクションを元に戻します。

4

4 に答える 4

1

Clickable(false) を設定すると、そのテキストビューをクリックできなくなります。したがって、おそらく解決策は、元に戻すボタンを追加し、実行したアクションを ArrayList または何らかの種類のスタックに保存することです。

于 2013-03-22T13:46:29.977 に答える
0

**

更新して追加のヘルプを求める

**私はいくつかの進歩を遂げました.ボタンのクリックによって動的にテキストをテキストビューに追加するために使用する方法をソーターにしました。上記の問題を解決するためにシーケンスのようなソリューションを使用しましたが、思い通りに動作しません。ボタンのクリックの順序を並べ替える配列リストを作成しました。

ArrayList<TextView> letterList = new ArrayList<TextView>();

(はい、テキストビューもありますが、ボタンと呼んで他の文字グループから分離しています)。

次に、このコードでボタンがクリックされたときに、対応するビューを arraylist に追加します。

if(letterList.size() < 8 && !letterList.contains(randomLetter1))
        letterList.add(randomLetter1);

テキストビューでは、リストを使用してボタンのビュー(実際にはテキストビュー)を取得します。

String wLetter = wordLetter1.getText().toString();
        if(wLetter.equals(letterList.get(0).toString()))
            letterList.get(0).setText(wLetter);
            letterList.get(0).setClickable(true);
            letterList.get(0).setEnabled(true);
            wordLetter1.setText("");

7 つの Textviews とボタンすべてに対して上記を掛けます。このアプローチは、位置が変わるまでうまく機能します。たとえば、この順序で 1 番目、3 番目、6 番目のボタンを押すと、これらの 3 つのボタンのクリックで最初の 3 つのテキストビューがファイルされます。2番目のテキストビューをクリックすると、このテキストビューの文字がボタンに戻り(実際、このボタンは再びクリック可能になります)、位置がクリアされます。たとえば、4 番目のボタンを押すと、2 番目のクリア位置が取得され、問題が発生します。これは、作成された textview/button のペアが更新されないために発生します。したがって、3 番目のボタンが最初のテキストビューにリンクしている場合、このリンクは、3 番目のテキストビューの位置を占める 3 番目のボタンを 2 回クリックしても変化しません。しかし、私はこのリンクを更新したいと思っています。上記の説明から問題を理解していただければ幸いです。

では、これは上記のソリューションを改良することで実現できると思いますか、それともまったく別の道をたどらなければならないと思いますか? 私は関連する研究をせずに開発し、一人で読んで学ぼうとするのは初めてなので、理解しやすくするために、私のコードに関連する回答にいくつかのコードを含めてみてください。

于 2013-03-29T19:07:23.603 に答える
0

これを取り消すには、何らかの方法で最後のアクションを保存する必要があります。テキストビューをクリックした後、このビューに対して前回行われたアクションを知る必要があります。このためには、この特定のテキストビューを最後に更新したボタンを知る必要があります。

ステートを保存するには、多くのことができます。たとえば、前回変更したテキストビューの ID とボタンの ID をキーと値のペアとして保存できます。または、0 から n までの連続した値を textview に設定し、1 次元配列にデータを textview の割り当てられた番号としてインデックスとして、ボタンの値として保存することができます。または、他の方法を使用することもできます。しかし、重要なことは、特定のテキストビューのどのボタンが前回変更されたかという情報を保存する必要があるということです。

上記の値がわかっている場合は、設定を簡単に元に戻すことができます。

私が述べたように、それを行うには他にも多くの方法があるかもしれないので、他の方法を考えることができます. そして、私があなたの問題を誤解している場合は、私を修正してください.

于 2013-03-23T01:30:44.773 に答える
0

私が見つけた解決策の別の更新

上記の方法(クリックしたボタンのシーケンスをリストに保存する)で解決策が見つからなかったので、別のアプローチを試しました。今回は、無効/クリック不可のボタンを返すメソッドによって、ボタンのクリック可能/有効なプロパティを使用しました。

public List<TextView> getFreePos(){
TextView[] randomletters = {randomLetter1, randomLetter2, randomLetter3,
        randomLetter4, randomLetter5, randomLetter6, randomLetter7};
int i;
for( i=0; i<randomletters.length; i++){
if(randomletters[i].isClickable()== false){
    clickable.add(randomletters[i]);
}
}   
return clickable;
}

次に、各テキストビューでそれを使用して、テキストビューのテキストが最初のリストのオブジェクトと等しいかどうかを確認します。

String wLetter = wordLetter1.getText().toString();          
        if(isEmpty(wordLetter1)){
        getFreePos().clear();
        getFreePos();           
        if(clickable.get(0).getText().toString().equals(wLetter)){
            clickable.get(0).setText(wLetter);
            clickable.get(0).setClickable(true);
            clickable.get(0).setEnabled(true);
        }
        else if(clickable.get(1).getText().toString().equals(wLetter)){
            clickable.get(1).setText(wLetter);
            clickable.get(1).setClickable(true);
            clickable.get(1).setEnabled(true);
        }
        else if (clickable.get(2).getText().toString().equals(wLetter)){
            clickable.get(2).setText(wLetter);
            clickable.get(2).setClickable(true);
            clickable.get(2).setEnabled(true);
        }
        else if (clickable.get(3).getText().toString().equals(wLetter)){
            clickable.get(3).setText(wLetter);
            clickable.get(3).setClickable(true);
            clickable.get(3).setEnabled(true);
        }
        else if (clickable.get(4).getText().toString().equals(wLetter)){
            clickable.get(4).setText(wLetter);
            clickable.get(4).setClickable(true);
            clickable.get(4).setEnabled(true);
        }
        else if (clickable.get(5).getText().toString().equals(wLetter)){
            clickable.get(5).setText(wLetter);
            clickable.get(5).setClickable(true);
            clickable.get(5).setEnabled(true);
        }
        else if (clickable.get(6).getText().toString().equals(wLetter)){
            clickable.get(6).setText(wLetter);
            clickable.get(6).setClickable(true);
            clickable.get(6).setEnabled(true);
        }
        }
        wordLetter1.setText("");

この方法で問題なく動作しますが、これらすべての if ステートメントを回避する方法を見つけることができませんでした (上記のコードに 7 を掛けたもの)。次のように for ループを使用しようとしました。

for (int i=0; i<clickable.size(); i++){
            if (wLetter.equals(clickable.get(i).getText().toString()))
        clickable.get(i).setText(wLetter);
        clickable.get(i).setEnabled(true);
        clickable.get(i).setClickable(true);
        wordLetter3.setText("");
        break;

また、if ステートメントの代わりにスイッチ ケースを使用することもできましたが、どちらも期待どおりに機能しませんでした。インデックスの範囲外エラー (毎回発生するわけではありません) と、間違ったボタンが有効になり、間違った文字に変更されるという問題がありました。したがって、結論として、上記の if/else if 方法のみが期待どおりに機能します。コードが短くコンパクトになればいいのですが。何か考え/アイデアはありますか?

于 2013-03-31T21:46:53.630 に答える