1

解決策は比較的単純だと思いますが、何かが欠けています。基本的に、ユーザー側からの私のプログラムの流れは、ドロップダウンメニュー(スピナーウィジェット)からアイテムが選択されるまで、画面上のボタンが半透明で応答しないような「ホーム画面」があることです。コード側では、XML ファイルでレイアウトを定義してから、関連するすべてを Java で記述します。したがって、 onCreate() メソッドで、ボタンを次のように初期化しました。

public void initButtons() {
        Button buttonOne = (Button) findViewById(R.id.button_one);
        Button buttonTwo = (Button) findViewById(R.id.button_two);
        Button buttonThree = (Button) findViewById(R.id.button_three);
        Button buttonFour = (Button) findViewById(R.id.button_four);

        buttonOne.setClickable(false);
        buttonTwo.setClickable(false);
        buttonThree.setClickable(false);
        buttonFour.setClickable(false);

        buttonOne.setAlpha(0.5f);
        ButtonTwo.setAlpha(0.5f);
        buttonThree.setAlpha(0.5f);
        buttonFour.setAlpha(0.5f);
    }

それはうまくいきますが、アイテムがスピナーから選択された後にいくつかの onClickListeners を設定したいと思います。したがって、アクティビティ クラスは onItemClickListener を実装し、コードには次のコールバックがあります。

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
        long id) {
    if (position != 0) {
        selectedTown = parent.getItemAtPosition(position).toString();
        CharSequence text = "You've Selected " + selectedItem;
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(SampleUI.this, text, duration);
        toast.show();
        itemSelected = true;
        handler.sendEmptyMessage(1);
    } else { 
        itemSelected = false;
    }

}

@Override
public void onNothingSelected(AdapterView<?> arg0) {

}

boolean itemSelected はアクティビティ クラス内のグローバル スコープであり、Toast はデバッグ目的であり、必須ではありません。しかし、私が抱えている問題は、スピナーの項目 (位置 0 の下) が選択された後にボタンを変更しようとしたときです。次のように定義されたメッセージハンドラーがあります。

Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if ((itemSelected == true) && (buttonsActivated == false)) {
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(SampleUI.this,"Activating Buttons", duration);
                toast.show();
                activateButtons();
            }
            super.handleMessage(msg);
        }
    };

このハンドラーは、次のような activateButtons() メソッドを呼び出すまでは適切に機能します。

public void activateButtons() {
        buttonOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Code to respond to buttonClick
            }
        });
}

いずれかのコールバックまたはハンドラーで UI 要素を操作しようとすると、常に Java NULL ポインター例外が発生します。私が見逃したのはかなり単純で基本的なものだと確信していますが、問題を見つけることができないようです。誰かアイデアがあれば、ぜひ聞かせてください :) Will SJ

4

2 に答える 2

1

次のパターンを使用します

public void initButtons(){      
    Button buttonOne = (Button)findViewById(R.id.button_one);
    Button buttonTwo = (Button)findViewById(R.id.button_two);
    Button buttonThree = (Button)findViewById(R.id.button_three);
    Button buttonFour = (Button)findViewById(R.id.button_four);

    buttonOne.setClickable(false);
    buttonTwo.setClickable(false);
    buttonThree.setClickable(false);
    buttonFour.setClickable(false);

    buttonOne.setEnabled(false);
    buttonTwo.setEnabled(false);
    buttonThree.setEnabled(false);
    buttonFour.setEnabled(false);

    buttonOne.setAlpha(0.5f);
    buttonTwo.setAlpha(0.5f);
    buttonThree.setAlpha(0.5f);
    buttonFour.setAlpha(0.5f);

    buttonOne.setOnClickListener(this);
    buttonTwo.setOnClickListener(this);
    buttonThree.setOnClickListener(this);
    buttonFour.ssetOnClickListener(this);


}

あなたのアクティビティにonClickListenerを実装させ、このようなスイッチケースを持たせます

 public void onClick(View v){
    switch (v.getId()){
    case R.id.buttonOne :
// to do when clicked
        break;
    case R.id.buttonTwo :

        break;
    default :
        break;
    }
}

そしてあなたのハンドラ呼び出しの中で

public void activateButtons() {
     buttonOne.setClickable(true);
   buttonOne.setEnabled(true);
 }
于 2012-12-24T11:14:59.703 に答える
1

メソッド内ではなく、クラス レベルですべての UI 要素を次のように宣言します。

//********** DELCARE ALL UI ELEMETS HERE ******

    Button buttonOne,buttonTwo,buttonThree,buttonFour;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initButtons(); 
      }

    public void initButtons() {
          buttonOne = (Button) findViewById(R.id.button_one);
          buttonTwo = (Button) findViewById(R.id.button_two);
          buttonThree = (Button) findViewById(R.id.button_three);
          buttonFour = (Button) findViewById(R.id.button_four);
          // your code here...
        }
于 2012-12-24T10:50:18.133 に答える