2014-10-20 5 views
-1

Я новичок в мире Android-программирования, и я хочу, когда кнопка нажата, чтобы сделать что-то. Вот что я сделал до сих пор:Не могу ссылаться на локальную переменную

public class MainActivity extends Activity { 
    protected void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     setContentView(R.layout.activity_main); 
    Button button = (Button) findViewById(R.id.button1); 
    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 


     Spinner s1,s2,s3,s4,s5,s6,s7; 
     TextView txt3,txt4,txt5,txt6,txt7,txt8,txt9; 
     EditText ed1; 

     s7 = (Spinner) findViewById(R.id.spinner7); 
     s1 = (Spinner) findViewById(R.id.spinner1); 
     s2 = (Spinner) findViewById(R.id.spinner2); 
     s3 = (Spinner) findViewById(R.id.spinner3); 
     s4 = (Spinner) findViewById(R.id.spinner4); 
     s5 = (Spinner) findViewById(R.id.spinner5); 
     s6 = (Spinner) findViewById(R.id.spinner6); 
     txt4 = (TextView) findViewById(R.id.textView4); 
     txt3 = (TextView) findViewById(R.id.textView3); 
     txt5 = (TextView) findViewById(R.id.textView5); 
     txt6 = (TextView) findViewById(R.id.textView6); 
     txt7 = (TextView) findViewById(R.id.textView7); 
     txt8 = (TextView) findViewById(R.id.textView8); 
     txt9 = (TextView) findViewById(R.id.textView9); 


     ed1 = (EditText) findViewById(R.id.editText1); 


     s7.setOnItemSelectedListener(
       new OnItemSelectedListener() { 
        public void onItemSelected(
          AdapterView<?> parent, View view, int position, long id) { 

          String val = s7.getSelectedItem().toString(); 
          txt4.setText(val); 

        } 


        public void onNothingSelected(AdapterView<?> parent) { 

        } 
       }); 
     s2.setOnItemSelectedListener(
       new OnItemSelectedListener() { 
        public void onItemSelected(
          AdapterView<?> parent, View view, int position, long id) { 

          String val2 = s2.getSelectedItem().toString(); 
          txt5.setText(val2); 

        } 


        public void onNothingSelected(AdapterView<?> parent) { 

        } 
       }); 
     s3.setOnItemSelectedListener(
       new OnItemSelectedListener() { 
        public void onItemSelected(
          AdapterView<?> parent, View view, int position, long id) { 

          String val3 = s3.getSelectedItem().toString(); 
          txt6.setText(val3); 

        } 


        public void onNothingSelected(AdapterView<?> parent) { 

        } 
       }); 
     s1.setOnItemSelectedListener(
       new OnItemSelectedListener() { 
        public void onItemSelected(
          AdapterView<?> parent, View view, int position, long id) { 

          String val1 = s1.getSelectedItem().toString(); 
          txt3.setText(val1); 

        } 


        public void onNothingSelected(AdapterView<?> parent) { 

        } 
       }); 
     s5.setOnItemSelectedListener(
       new OnItemSelectedListener() { 
        public void onItemSelected(
          AdapterView<?> parent, View view, int position, long id) { 

          String val5 = s5.getSelectedItem().toString(); 
          txt7.setText(val5); 

        } 


        public void onNothingSelected(AdapterView<?> parent) { 

        } 
       }); 
     s6.setOnItemSelectedListener(
       new OnItemSelectedListener() { 
        public void onItemSelected(
          AdapterView<?> parent, View view, int position, long id) { 

          String val6 = s6.getSelectedItem().toString(); 
          txt8.setText(val6); 

        } 


        public void onNothingSelected(AdapterView<?> parent) { 

        } 
       }); 
     s4.setOnItemSelectedListener(
       new OnItemSelectedListener() { 
        public void onItemSelected(
          AdapterView<?> parent, View view, int position, long id) { 

          String val7 = s4.getSelectedItem().toString(); 
          txt9.setText(val7); 

        } 


        public void onNothingSelected(AdapterView<?> parent) { 

        } 
       }); 




    }} //Syntax error, insert ";" to complete Statement 
}} 

однако, вся моя переменная в коде (s1, s2, txt1, txt2, ...) получаю сообщение об ошибке «Не удается обратиться к неконечное локальной переменной [вар ], определяемый в охватывающей области видимости '', и я получаю сообщение об ошибке «Синтаксическая ошибка, вставка»; завершить заявление»в месте, указанном на code.Can кто поможет мне решить эту проблему

спасибо

+1

Почему вы помещаете своих прослушивателей в свой прослушиватель onclick? – brso05

+0

Что должно произойти, когда вы нажимаете кнопку? –

+0

s7.setOnItemSelectedListener ( нового OnItemSelectedListener() { общественных недействительный onItemSelected ( AdapterView родителя, Вид вид, внутр позиция, длинный идентификатор) { Строка вал = s7.getSelectedItem() ToString();. txt4.setText (val); }, а остальное до конца –

ответ

0

Вы не можете, потому что есть локальные переменные, и вы назвали их от anonymous class;?! вы только объявить их как свойства класса.

public class MainActivity extends Activity { 
    Spinner s1,s2,s3,s4,s5,s6,s7; 
    TextView txt3,txt4,txt5,txt6,txt7,txt8,txt9; 
    // The rest of your code 
+0

спасибо! Что случилось с другой ошибкой tho? –

+0

@Phil_oneil Добавить правильный параграф + точка с запятой, чтобы закрыть ваше задание. Что еще более важно (и, как уже было задано), почему вы делаете это внутри прослушивателя кликов? – Krylez

+0

Когда вы вызывали button.setOnClickListener, вы забыли закрыть вызов функции. button.setOnClickListener (new ...); –

0

Объявите свои локальные переменные, как ваши переменные класса, а затем вы должны выполнить метод OnClickListener() должным образом в конце его. вы должны закрыть метод с закрывающей скобкой и точка с запятой при синтаксической ошибке.

+0

Что вы имеете в виду? Я сделал это, и ошибка все еще там –

0

Три предложения:

  1. Будьте последовательны с форматированием и отступов в коде.

  2. Использование массивов.

  3. Создайте один OnItemClickListener и используйте его для всех ваших прядильщиков.

0

Если вам нужно получить доступ к переменной за пределами анонимного класса, она должна быть final. Вашего код

public class MainActivity extends Activity { 
    protected void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     final Spinner s1,s2,s3,s4,s5,s6,s7; 
     final TextView txt3,txt4,txt5,txt6,txt7,txt8,txt9; 
     final EditText ed1; 

     s7 = (Spinner) findViewById(R.id.spinner7); 
     s1 = (Spinner) findViewById(R.id.spinner1); 
     s2 = (Spinner) findViewById(R.id.spinner2); 
     s3 = (Spinner) findViewById(R.id.spinner3); 
     s4 = (Spinner) findViewById(R.id.spinner4); 
     s5 = (Spinner) findViewById(R.id.spinner5); 
     s6 = (Spinner) findViewById(R.id.spinner6); 
     txt4 = (TextView) findViewById(R.id.textView4); 
     txt3 = (TextView) findViewById(R.id.textView3); 
     txt5 = (TextView) findViewById(R.id.textView5); 
     txt6 = (TextView) findViewById(R.id.textView6); 
     txt7 = (TextView) findViewById(R.id.textView7); 
     txt8 = (TextView) findViewById(R.id.textView8); 
     txt9 = (TextView) findViewById(R.id.textView9); 


     ed1 = (EditText) findViewById(R.id.editText1); 

     setContentView(R.layout.activity_main); 
     Button button = (Button) findViewById(R.id.button1); 
     button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 






       s7.setOnItemSelectedListener(
         new AdapterView.OnItemSelectedListener() { 
          public void onItemSelected(
            AdapterView<?> parent, View view, int position, long id) { 

           String val = s7.getSelectedItem().toString(); 
           txt4.setText(val); 

          } 


          public void onNothingSelected(AdapterView<?> parent) { 

          } 
         }); 
       s2.setOnItemSelectedListener(
         new AdapterView.OnItemSelectedListener() { 
          public void onItemSelected(
            AdapterView<?> parent, View view, int position, long id) { 

           String val2 = s2.getSelectedItem().toString(); 
           txt5.setText(val2); 

          } 


          public void onNothingSelected(AdapterView<?> parent) { 

          } 
         }); 
       s3.setOnItemSelectedListener(
         new OnItemSelectedListener() { 
          public void onItemSelected(
            AdapterView<?> parent, View view, int position, long id) { 

           String val3 = s3.getSelectedItem().toString(); 
           txt6.setText(val3); 

          } 


          public void onNothingSelected(AdapterView<?> parent) { 

          } 
         }); 
       s1.setOnItemSelectedListener(
         new OnItemSelectedListener() { 
          public void onItemSelected(
            AdapterView<?> parent, View view, int position, long id) { 

           String val1 = s1.getSelectedItem().toString(); 
           txt3.setText(val1); 

          } 


          public void onNothingSelected(AdapterView<?> parent) { 

          } 
         }); 
       s5.setOnItemSelectedListener(
         new OnItemSelectedListener() { 
          public void onItemSelected(
            AdapterView<?> parent, View view, int position, long id) { 

           String val5 = s5.getSelectedItem().toString(); 
           txt7.setText(val5); 

          } 


          public void onNothingSelected(AdapterView<?> parent) { 

          } 
         }); 
       s6.setOnItemSelectedListener(
         new OnItemSelectedListener() { 
          public void onItemSelected(
            AdapterView<?> parent, View view, int position, long id) { 

           String val6 = s6.getSelectedItem().toString(); 
           txt8.setText(val6); 

          } 


          public void onNothingSelected(AdapterView<?> parent) { 

          } 
         }); 
       s4.setOnItemSelectedListener(
         new AdapterView.OnItemSelectedListener() { 
          public void onItemSelected(
            AdapterView<?> parent, View view, int position, long id) { 

           String val7 = s4.getSelectedItem().toString(); 
           txt9.setText(val7); 

          } 


          public void onNothingSelected(AdapterView<?> parent) { 

          } 
         }); 




      }}); //Syntax error, insert ";" to complete Statement 
    } 
} 
+0

Я хочу, когда я нажму кнопку s7.setOnItemSelectedListener (чтобы произойти (это pu-содержимое spinner в текстовом виде). ​​Он разбивается, когда я нажимаю кнопку с вашим кодом.thanks –

0

Хотя другие ответы предложили сделать переменные переменный класс, есть еще один способ решить первую ошибку: добавить final деклараций.

final Spinner s1,s2,s3,s4,s5,s6,s7; 
final TextView txt3,txt4,txt5,txt6,txt7,txt8,txt9; 

При добавлении final деклараций, и не дают им начальных значений, Java позволит назначить им один раз, а затем значение «фиксированный», и вы не можете назначить им больше. Необходимо использовать переменные final, если они относятся к анонимному типу, например, который вы используете. (Это связано с тем, что Java хочет убедиться, что переменные не будут меняться после создания объекта-слушателя. Если они могут измениться, тогда может возникнуть путаница в том, что «предполагается, что оно использует значение, которое имела переменная при создании слушателя , или предполагается использовать последнее значение? »)

В целом, лучше всего объявить переменные в самой внутренней области, где они используются. Вот почему мне не нравится решение просто сделать их переменными класса. Это решение избавляется от ошибки, но уступает из «чистого кода». И так как достаточно просто сделать переменные final, что делает их переменными класса, не нужно, если вы действительно не намереваются, чтобы они были частью состояния MainActivity.

Причины ошибки ; является то, что на самом верху вашего фрагмента кода, вы говорите

button.setOnClickListener(new View.OnClickListener() { 
    --followed by lots and lots of code-- 

Поскольку у вас есть так много коды в вашем слушателе, это легко потерять след если заявление существ и заканчивается. Но приведенное выше утверждение должно иметь правильный синтаксис, как и любое другое заявление, которое означает, что он должен иметь следующий вид:

button.setOnClickListener(new View.OnClickListener() { [code] }); 

То есть, вы должны иметь закрывающую фигурную скобку, с последующим закрытием ), что соответствует ( перед new, а затем точкой с запятой.

P.S. У вас много дублированного кода в слушателях onSelectedItem; как только вы начнете работать, вы можете упростить ситуацию. Можно написать частный метод, который создает и возвращает слушателя:

private AdapterView.OnItemSelectedListener listenerForSpinner(final Spinner s, final TextView t) { 
    return new AdapterView.OnItemSelectedListener() { 
     public void onItemSelected(
      AdapterView<?> parent, View view, int position, long id) { 

      String val = s.getSelectedItem().toString(); 
      t.setText(val); 
     } 

     public void onNothingSelected(AdapterView<?> parent) { 
     } 
    }; 
} 

и в SetOnClickListener:

s7.setOnItemSelectedListener(listenerForSpinner(s7, txt4)); 
s2.setOnItemSelectedListener(listenerForSpinner(s2, txt5)); 
... 

и так далее, что делает ваш код намного проще. (Но использование массивов, как уже было предложено, упростило бы еще больше.)

+0

, но это будет сделайте s7.onitemselected ... и остальное (элемент места spinner в textview) произойдет, когда я нажму кнопку? Это то, что я хочу, чтобы он сделал im, не уверен, что это так .. спасибо –

+0

@Phil_oneil Я сосредоточился на компиляции кода, а не на том, чтобы он работал. Если он не работает, и никто не ответил на это, я еще раз посмотрю. – ajb

+0

Это было бы очень полезно, потому что я не знаю, как это сделать –

Смежные вопросы