2017-07-19 47 views
0

我有以下代碼,我想在按鈕偵聽器中訪問'selectedTeam'。如何從spinner監聽器訪問變量?

 //Adding setOnItemSelectedListener method on spinner. 
     sTeams.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, 
             int position, long id) { 
       selectedTeam = parent.getItemAtPosition(position).toString(); 
       editText.setText(selectedTeam, TextView.BufferType.EDITABLE); 
      } 

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

     buttonApply.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View v) { 
       String editedName = editText.getText().toString(); 
       // Here I want to access selectedTeam 
      } 
     }); 

我試圖宣佈該方法以外的變量,但給出的誤差從內部類內訪問「變量‘selectedTeam'is,需要聲明最終’。我試過了,但是因爲最終的字符串不能被改變,所以這是行不通的。

回答

1

改爲使用班級成員

JLS 8.1.3. Inner Classes and Enclosing Instances

當一個內部類(其聲明不發生在一個靜態 上下文)指的是一個實例變量,它是一個 詞法封閉類的一個成員,所述相應的可變詞彙 封閉實例被使用。

任何使用的局部變量,形式參數或異常參數,但未在內部類中聲明的 都必須聲明爲final。

這意味着你只能在一個匿名內部類使用final變量或封閉類構件

[...] 
private String selectedTeam; 
[...] 

//Adding setOnItemSelectedListener method on spinner. 
    sTeams.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, 
            int position, long id) { 
      selectedTeam = parent.getItemAtPosition(position).toString(); 
      editText.setText(selectedTeam, TextView.BufferType.EDITABLE); 
     } 

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

    buttonApply.setOnClickListener(new Button.OnClickListener() { 
     public void onClick(View v) { 
      String editedName = editText.getText().toString(); 
      if (selectedTeam != null && !"".equals(selectedTeam)) { 
       // Do something 
      } 
     } 
    }); 
+0

感謝說明。我現在明白了,儘管我還不知道如何解決我的問題。如何從方法外訪問'selectedTeam'? –

+0

對不起我的壞。我編輯爲'selectedTeam'。'selectedTeam'現在包含班級成員,因此您可以在匿名班級內外訪問它。 –

+0

@ no-name請注意外面不再有'selectedTeam'聲明來防止陰影問題,或者您只是簡單地在內部類中使用'ClassName.this.selectedTeam'而不是'selectedTeam'。 –

1

您需要聲明變量global。

public class MainActivity extends AppCompatActivity { 

String selectedteam; 
... 
buttonApply.setOnClickListener(new Button.OnClickListener() { 
     public void onClick(View v) { 
      String editedName = editText.getText().toString(); 
      selectedteam = editedName; // or whatever you want 
     } 
    }); 
0

在我的情況下,我使用共享首選項來存儲值,並獲取我想要使用的值。

SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit(); 
editor.putString("name", "selectedTeam"); 
editor.apply(); 

如何獲得價值:

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String restoredText = prefs.getString("name", null); 

希望它可以幫助

0

你需要做它以不同的方式。 這個工作對我來說,我已經實現了AdapterView.OnItemSelectedListener和View.OnClickListener的活動並覆蓋了方法。

您現在可以通過OnClick方法訪問selectedTeam。

(如果你使用的XML文件,想改變你的應用的應用包)

MainActivity.java

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener,View.OnClickListener{ 

    Spinner sTeam; 
    EditText editText; 
    Button button; 
    String selectedTeam; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     sTeam = (Spinner) findViewById(R.id.spinner_team); 
     button = (Button) findViewById(R.id.confirmation_button); 
     editText = (EditText) findViewById(R.id.edittext_team); 


     List<String> spinnerArray = new ArrayList<String>(); 
     spinnerArray.add("team1"); 
     spinnerArray.add("team2"); 
     spinnerArray.add("team3"); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       this, android.R.layout.simple_spinner_item, spinnerArray); 

     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     sTeam.setAdapter(adapter); 

     button.setOnClickListener(this); 
     sTeam.setOnItemSelectedListener(this); 
    } 

    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     selectedTeam = parent.getItemAtPosition(position).toString(); 
     editText.setText(selectedTeam, TextView.BufferType.EDITABLE); 
    } 

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

    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()){ 
      case (R.id.confirmation_button) :{ 
       //You can access to selected team here 
      }break; 
     } 
    } 


} 

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.yourpackage.test"> 

    <Spinner 
     android:id="@+id/spinner_team" 
     android:layout_width="368dp" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="8dp" 
     android:layout_marginRight="8dp" 
     android:layout_marginTop="16dp" 
     app:layout_constraintHorizontal_bias="0.0" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

    <Button 
     android:id="@+id/confirmation_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     android:layout_marginTop="8dp" 
     app:layout_constraintTop_toBottomOf="@+id/edittext_team" 
     app:layout_constraintLeft_toRightOf="@+id/edittext_team" 
     android:layout_marginLeft="8dp" /> 

    <EditText 
     android:id="@+id/edittext_team" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="8dp" 
     android:layout_marginTop="8dp" 
     android:ems="10" 
     android:inputType="textPersonName" 
     android:text="Name" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/spinner_team" /> 

</android.support.constraint.ConstraintLayout>