通过 getter 而不是 toString 获取枚举值
Getting enum value by getter not toString
我对 Java 中的枚举有一个疑问。所以我需要用枚举值填充我的 Spinner Adapter。我知道我可以重写枚举中的 toString 方法并使用 values() 但在这种情况下,我尝试以不同的方式实现,因为我可能需要保持 toString() 不变。
我在枚举中创建了 getters,但我不能在任何地方使用它们,我也不知道为什么。如果有人能指出我的错误和进一步的指导,那就太好了。
我想用我的枚举的第一个字符串值 (speciesLabel
) 填充我的微调器。
当我尝试在适配器中调用我的 getter 时,Android Studio 说没有这样的方法可以调用
speciesSpinner.setAdapter(new ArrayAdapter<Species>(this,R.layout.row_default, Species.getSoeciesLabel()));
Species.java(枚举)
public enum Species {
HUMAN("Human", "Human description", 90),
GAND("Gand", "Gand description", 100);
private final String speciesLabel;
private final String speciesDescription;
private final int startingXp;
private Species(String speciesLabel, String speciesDescription, int startingXp) {
this.speciesLabel = speciesLabel;
this.speciesDescription = speciesDescription;
this.startingXp = startingXp;
}
public String getSpeciesLabel() {
return speciesLabel;
}
public String getSpeciesDescription() {
return speciesDescription;
}
public int getStartingXp() {
return startingXp;
}
@Override
public String toString() {
return getSpeciesLabel();
}
}
NewCharacterActivity.java
package com.example.androiddev_adam.starwarscharactercreator.views.activities;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import com.example.androiddev_adam.starwarscharactercreator.R;
import com.example.androiddev_adam.starwarscharactercreator.model.Species;
public class NewCharacterActivity extends ActionBarActivity {
private EditText toonName;
private Spinner speciesSpinner;
private ProgressBar progressBar;
private ImageView speciesImage;
private Button btnNext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_character);
toonName = (EditText)findViewById(R.id.toonNameEditText);
speciesSpinner = (Spinner)findViewById(R.id.speciesSpinner);
speciesSpinner.setAdapter(new ArrayAdapter<Species>(this,R.layout.row_default, Species.values()));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_new_character, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
提前谢谢你:)
我想你对ArrayAdapter的构造函数有误解,构造函数中的第三个参数是textViewResourceId,用来设置Text!假设在 R.layout.row_default
中你有一个名为 txtTitle
的 TextView,你想在其中设置 speciesLabel
而不是像这样:
speciesSpinner.setAdapter(new ArrayAdapter<Species>(this,R.layout.row_default, R.id.txtTitle, Species.values()));
Android Doc Reference
来自参考:
public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)
旁注:
您无法调用 Species.getSpeciesLabel()
的原因是 getSpeciesLabel()
不是静态方法,因此您不能使用 class 名称调用它。以下方法调用均有效:
// Get Label of a specific specie
Log.d("", Species.HUMAN.getSpeciesLabel());
// Get
Species[] specieses = Species.values();
for (Species species : specieses) {
Log.d("", species.getSpeciesLabel());
}
我对 Java 中的枚举有一个疑问。所以我需要用枚举值填充我的 Spinner Adapter。我知道我可以重写枚举中的 toString 方法并使用 values() 但在这种情况下,我尝试以不同的方式实现,因为我可能需要保持 toString() 不变。
我在枚举中创建了 getters,但我不能在任何地方使用它们,我也不知道为什么。如果有人能指出我的错误和进一步的指导,那就太好了。
我想用我的枚举的第一个字符串值 (speciesLabel
) 填充我的微调器。
当我尝试在适配器中调用我的 getter 时,Android Studio 说没有这样的方法可以调用
speciesSpinner.setAdapter(new ArrayAdapter<Species>(this,R.layout.row_default, Species.getSoeciesLabel()));
Species.java(枚举)
public enum Species {
HUMAN("Human", "Human description", 90),
GAND("Gand", "Gand description", 100);
private final String speciesLabel;
private final String speciesDescription;
private final int startingXp;
private Species(String speciesLabel, String speciesDescription, int startingXp) {
this.speciesLabel = speciesLabel;
this.speciesDescription = speciesDescription;
this.startingXp = startingXp;
}
public String getSpeciesLabel() {
return speciesLabel;
}
public String getSpeciesDescription() {
return speciesDescription;
}
public int getStartingXp() {
return startingXp;
}
@Override
public String toString() {
return getSpeciesLabel();
}
}
NewCharacterActivity.java
package com.example.androiddev_adam.starwarscharactercreator.views.activities;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import com.example.androiddev_adam.starwarscharactercreator.R;
import com.example.androiddev_adam.starwarscharactercreator.model.Species;
public class NewCharacterActivity extends ActionBarActivity {
private EditText toonName;
private Spinner speciesSpinner;
private ProgressBar progressBar;
private ImageView speciesImage;
private Button btnNext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_character);
toonName = (EditText)findViewById(R.id.toonNameEditText);
speciesSpinner = (Spinner)findViewById(R.id.speciesSpinner);
speciesSpinner.setAdapter(new ArrayAdapter<Species>(this,R.layout.row_default, Species.values()));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_new_character, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
提前谢谢你:)
我想你对ArrayAdapter的构造函数有误解,构造函数中的第三个参数是textViewResourceId,用来设置Text!假设在 R.layout.row_default
中你有一个名为 txtTitle
的 TextView,你想在其中设置 speciesLabel
而不是像这样:
speciesSpinner.setAdapter(new ArrayAdapter<Species>(this,R.layout.row_default, R.id.txtTitle, Species.values()));
Android Doc Reference 来自参考:
public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)
旁注:
您无法调用 Species.getSpeciesLabel()
的原因是 getSpeciesLabel()
不是静态方法,因此您不能使用 class 名称调用它。以下方法调用均有效:
// Get Label of a specific specie
Log.d("", Species.HUMAN.getSpeciesLabel());
// Get
Species[] specieses = Species.values();
for (Species species : specieses) {
Log.d("", species.getSpeciesLabel());
}