0

内部でさまざまな変数 (temperature_var、size_var、yolk_var) を宣言しており、これらの変数を別のボタンsetOnItemSelectedListenersに渡したいと考えています。setOnClickListener

temperature_var問題は、内の変数 (example ) にアクセスできないことですsetOnClickListener。そのため、Eclipse は変数をローカルで宣言するように指示します。onclick/内でこれらの変数を渡す方法がわかりませんOnItemSelectedListeners。完全なコードは次のようになります。

package com.example.eggtimer;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemSelectedListener {

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

        // Call Spinners & Buttons
        Spinner temperature = (Spinner) findViewById(R.id.spinnerTemperature);
        Spinner size = (Spinner) findViewById(R.id.spinnerSize);
        Spinner yolk = (Spinner) findViewById(R.id.spinnerYolk);

        // Register Spinners & Buttons
       temperature.setOnItemSelectedListener(this);
       size.setOnItemSelectedListener(this);
       yolk.setOnItemSelectedListener(this);


        // Call Adapters
         ArrayAdapter<String> adapter_temperature = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.temperature));
            // Sets the list template
            adapter_temperature.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         ArrayAdapter<String> adapter_size = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.size));
            // Sets the list template
            adapter_size.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         ArrayAdapter<String> adapter_yolk = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.yolk));
            // Sets the list template
            adapter_yolk.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);        

        // Combine Adapters with Spinners   
        temperature.setAdapter(adapter_temperature);
        size.setAdapter(adapter_size);
        yolk.setAdapter(adapter_yolk);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void onItemSelected(AdapterView<?> arg0, View v, int arg2,
            long arg3) {
        Toast.makeText(getApplicationContext(), "It works", Toast.LENGTH_LONG).show();

        // Call Adapters again ==> I do not know why this is necessary but otherwise the array adapters can not be found within onItemSelected
         ArrayAdapter<String> adapter_temperature = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.temperature));
            // Sets the list template
            adapter_temperature.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         ArrayAdapter<String> adapter_size = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.size));
            // Sets the list template
            adapter_size.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         ArrayAdapter<String> adapter_yolk = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.yolk));
            // Sets the list template
            adapter_yolk.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);   

        // Call next button
         Button next = (Button) findViewById(R.id.buttonNext);

        // Debug Variables
        TextView debug1 = (TextView) findViewById(R.id.textViewDebug1);
        TextView debug2 = (TextView) findViewById(R.id.textViewDebug2);
        TextView debug3 = (TextView) findViewById(R.id.textViewDebug3);

        switch(v.getId()) {
        case R.id.spinnerSize:

            Toast.makeText(getApplicationContext(), "Spinner selected", Toast.LENGTH_LONG).show();


            break;
        default:
            break;
        }


    }

    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }
}
4

2 に答える 2

0

基本的に、最終的に宣言されたフィールドは、最初に設定された後は変更できません。

したがって、OnItemSelectedListeners (および他のリスナー) 内からフィールドを使用できるようにするには、コードで行うように匿名メソッドを使用する代わりに、Activity に OnItemSelectedListener を実装させることをお勧めします。

この例を見てみましょう: http://start-jandroid.blogspot.dk/2011/01/android-spinner-example.html

男は 1 つの Spinner のみを使用しますが、ご覧のとおり、Spinner はその ItemSelectedListener をアクティビティ (this) に設定します。

アクティビティの onItemSelected リスナー内で、次のようなスイッチを作成する必要があります。

@Override
public void onItemSelected(AdapterView<?> parent, View v, int position,
    long id) {
    switch(v.getId) {
    case R.id.mySpinner1:
        // Do stuff when the mySpinner1 has been selected like changing some text on a button like so:
        someString = "myNewString";
        myButton1.setText(someString);
        break;
    case R.id.mySpinner2:
        // Do stuff when the mySpinner2 has been selected like changing some text on another button like so:
        someOtherString = "mybrandNewString";
        myButton2.setText(someOtherString);
        break;
    default:
        break;
    }
}
于 2012-10-18T16:21:36.853 に答える
0

リスナーの外部で変数を使用する場合は、onclick リスナーの外部で変数を宣言します。

それらをアクティビティに入れるだけで、さまざまなリスナーすべてがアクセスできるようになります。

別の注意として、ビューにテキストを設定するだけの場合は、アクティビティに OnItemSelectedListener を実装させ、それらすべてを同じ onItemSelected メソッドに入れることができます。list.getItemAtPosition()次に、それを呼び出して文字列にキャストできます。コードを少し簡素化します。

于 2012-10-18T16:14:32.627 に答える