0

いくつかのボタンがあり、それらにいくつかのテキストが設定されており、アクティビティの開始時にそのテキストが表示されるようにする必要があります。その後、sqlite データベースからすべてのボタンにテキストを設定しましたが、ユーザーがボタンをクリックするまでそのテキストを表示したくありません。

最も簡単な解決策は、button.setText(c.getString(int)); を使用することです。ボタンがクリックされたときにdbからそのテキストを設定しますが、私のcカーソルはアクティビティスコープにないため、ボタンのonClickメソッドでは使用できません。nextQuestion() メソッド内のすべてをアクティビティ スコープに配置しようとしましたが、エラーが発生します。

だから私は、ボタンが押されるまでデータベースからすべてのテキストセットを非表示にする必要があると考えていました。どうやってするか?または、最初のアイデアがどういうわけか可能であれば、それはさらに良い.

これが私のゲームクラスです:

public class Game extends Activity implements View.OnClickListener{

    Button b1, b2, b3, b4, b5, b6, b7, b8, b9, b10;
    MediaPlayer buttonClicks;
    public boolean music;

    LinkedList<Long> mAnsweredQuestions = new LinkedList<Long>();

    private String generateWhereClause(){
        StringBuilder result = new StringBuilder();
        for (Long l : mAnsweredQuestions){
            result.append(" AND _ID <> " + l);
        }
        return result.toString();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.game);

        addListenerOnButton();


        nextQuestion();
    }

    private void addListenerOnButton() {
        buttonClicks = MediaPlayer.create(this, R.raw.button);
        b1 = (Button) findViewById(R.id.button1);
        b2 = (Button) findViewById(R.id.button2);
        b3 = (Button) findViewById(R.id.button3);
        b4 = (Button) findViewById(R.id.button4);
        b5 = (Button) findViewById(R.id.button5);
        b6 = (Button) findViewById(R.id.button6);
        b7 = (Button) findViewById(R.id.button7);
        b8 = (Button) findViewById(R.id.button8);
        b9 = (Button) findViewById(R.id.button9);

        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
        b3.setOnClickListener(this);
        b4.setOnClickListener(this);
        b5.setOnClickListener(this);
        b6.setOnClickListener(this);
        b7.setOnClickListener(this);
        b8.setOnClickListener(this);
        b9.setOnClickListener(this);

    }

    private void nextQuestion() {
        TestAdapter mDbHelper = new TestAdapter(this);
        mDbHelper.createDatabase();

        try{

            mDbHelper.open(); 

            Cursor c = mDbHelper.getTestData(generateWhereClause());

            mAnsweredQuestions.add(c.getLong(0));

            b1.setText(c.getString(2));
            b2.setText(c.getString(3));
            b3.setText(c.getString(4));
            b4.setText(c.getString(5));
            b5.setText(c.getString(6));
            b6.setText(c.getString(7));
            b7.setText(c.getString(8));
            b8.setText(c.getString(9));
            b9.setText(c.getString(10));
        }

            finally{
                mDbHelper.close();
            }

    }

    public void onClick(View v) {
        switch(v.getId()){
        case R.id.button1:
            if(music == true){
                buttonClicks.start();
                    }
            b1.setText(c.getString(2));// this is a good option, but can't use cursor
            b2.setEnabled(true);
            break;
        case R.id.button2:
            if(music == true){
                buttonClicks.start();
                    }
            b3.setEnabled(true);
            break;
        case R.id.button3:
            if(music == true){
                buttonClicks.start();
                    }

            break;
        case R.id.button4:
            if(music == true){
                buttonClicks.start();
                    }
        }

    }

}
4

5 に答える 5

0

最善の方法は次のとおりだと思います。

テキストを null または空に設定し、Java 実装でテキストを設定します。

このような:

teste.xml:

<Button android:id="@+button/testebutton" android:text="" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

Teste.java:

Button testeButton = (Button) findViewById(R.button.testebutton);
testeButton.setText("NEW TITLE");
于 2013-04-02T18:13:19.827 に答える
0

カーソルをメソッドローカル変数ではなく (クラスの) インスタンス変数にするのはどうですか? そして多分http://en.wikipedia.org/wiki/Lazy_initializationを使用して...

于 2013-04-02T18:17:47.710 に答える
0

より大きな根本的な問題の症状の解決策を見つけようとしています。アクティビティ間でデータを共有するのに問題がある場合は、この方向に進むべきではありません。

そうは言っても、特定の質問に答えるには、 に設定できtextColorますandroid.R.color.transparent

于 2013-04-02T18:10:55.343 に答える
0

ボタンのテキストのみを非表示にする組み込みメソッドはありませんが、データベースからの値を一連の変数に保存し、ボタンが押されるまでそれらをボタンに対して設定しないようにすることができます。

つまり、次のように変更する必要があります。

b1.setText(c.getString(2));
b2.setText(c.getString(3));
...
b9.setText(c.getString(10));

次のようなものに:

String mButtonText1, mButtonText2, ... mButtonText9; // <-- class members

mButtonText1 = c.getString(2);
mButtonText2 = c.getString(3);
...
mButtonText9 = c.getString(10);

(または、これらの値を配列に入れることもできます)

そして、でonClick()

b1.setText(mButtonText1);

ボタンのテキストを「非表示」にするには、単にorsetText()で呼び出します。""null

ボタンのテキストの色を「透明」に設定することで同じ効果が得られるかもしれませんが、私は試していません。

于 2013-04-02T18:11:36.127 に答える
0

文字列をいくつかの変数の中間ストレージに渡し、適切なタイミングでそれらの文字列からボタンのテキストを設定するのはどうですか?

于 2013-04-02T18:10:13.237 に答える