2015-04-21 2 views
0

У меня есть один вопрос об enums в Java. Поэтому мне нужно заполнить свой Spinner Adapter значениями перечисления. Я знаю, что я могу переопределить метод toString внутри enum и использовать значения(), но в этом случае я пытаюсь добиться этого по-другому, потому что мне может потребоваться оставить toString() нетронутым.Получение значения enum getter not toString

У меня есть геттеры внутри перечислений, но я не могу их использовать в любом месте, и я не знаю почему. Было бы здорово, если бы кто-то мог указать мою ошибку и указания пойти дальше.

Я хочу заполнить свой счетчик кулаком по строке (speciesLabel) моего Enum.

Когда я пытаюсь вызвать мой добытчик в адаптере, Android Студия говорит, что не существует такой метод вызвать

speciesSpinner.setAdapter(new ArrayAdapter<Species>(this,R.layout.row_default, Species.getSoeciesLabel())); 

Species.java (Enum)

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); 
    } 
} 

Вы заранее заранее

+0

Не совсем понятно, чего вы не можете достичь. Вы заполняете адаптер счетчика со значениями ... где возникают геттеры? Куда идет toString? Вы действительно просто говорите о том, как значения должны отображаться *? Вы говорите, что не можете использовать свои геттеры где угодно - как вы пытаетесь их использовать, и что не так? –

+0

Если я правильно вас понимаю, вам нужен подкласс '* Adapter'. 'ArrayAdapter' вызывает внутренне' toString() ', чтобы заполнить представления счетчика – Blackbelt

+0

Я попытался объяснить, чего я хочу добиться. Извините за мой язык :) – Glorifind

ответ

0

Я думаю, что вы недопонимаете конструктор ArrayAdapter, третьим параметром в конструкторе является textViewResourceId, для которого установлен текст! Предположим, что в R.layout.row_default у вас есть TextView имени txtTitle, который вы хотите установить 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) 

Side Примечание: Причина вы не способный вызвать Species.getSpeciesLabel(), заключается в том, что getSpeciesLabel() не является статическим методом, поэтому вы не можете его вызвать, используя имя класса. Возможны следующие методы:

// Get Label of a specific specie 
Log.d("", Species.HUMAN.getSpeciesLabel()); 

// Get 
Species[] specieses = Species.values(); 
for (Species species : specieses) { 
    Log.d("", species.getSpeciesLabel()); 
} 
+0

В моем row_default содержится только TextView, поэтому я предполагаю, что мне не нужен этот третий параметр. Я внес изменения в свой код 'speciesSpinner.setAdapter (новый ArrayAdapter (это, R.layout.row_default, R.id.rowText, Species)) ;, но Species теперь отмечены как красный, а компилятор говорит, что ожидается выражение. – Glorifind

+0

В моем ответе была ошибка, вам нужно написать вместо этого Species.values ​​() –

+0

Так что это означает, что я должен создать новый массив и заполнить его этими ярлыками, а затем вызвать его в адаптере? звучит как большое обходное решение :( – Glorifind

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