通过 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());
}