2013-12-17 3 views
0

Я хочу сделать свою единую тренировку доступной для всего приложения. Скажем, каждый отдельный тренинг из основного списка видов деятельности. Но я не получаю значения из класса Singleton. В чем проблема в моем коде. Я пытался со вчерашнего дня и не мог понять, почему? Заранее благодарны за Вашу помощь.Как реализовать класс Singleton в классе активности

Вот Singleton класс:

public class CurrentTraining { 

private Training training; //Training is my model class. 

private static CurrentTraining instance; 

private CurrentTraining() { 

} 

public static CurrentTraining getInstance() { 
    if (instance == null) 
     instance = new CurrentTraining(); 
    return instance; 

} 

public Training getTraining() { 
    return training; 
} 

public Training setTraining(Training training) { 
    return this.training = training; 
} 

}

Мой Основной класс деятельности:

public class MainActivity extends ListActivity implements OnItemClickListener { 

private Portfolio portfolio; 

private ListAdapter trainingListAdapter; 

private Dialog dialog; 

Training currentTraining; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    currentTraining = CurrentTraining.getInstance().getTraining(); 

    portfolio = new Portfolio(this); 

    trainingListAdapter = new ArrayAdapter<Training>(this, 
      android.R.layout.simple_list_item_1, 
      portfolio.getTrainingArrayList()); 

    setListAdapter(trainingListAdapter); 

    ((ListView) findViewById(android.R.id.list)) 
      .setOnItemClickListener(this); 
} 

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

    Log.i ("DEBUG" , currentTraining.getTitle()); 
    CurrentTraining.getInstance().setTraining(currentTraining); 

    Toast.makeText(getApplicationContext(), "You clicked on position : " + arg2 + " and ID : " + currentTraining.getId(), Toast.LENGTH_LONG).show(); 
    } 

OnClick к ListView он выходит из строя из-за NullPointer Exception.

+0

Personnaly не использует одиночные игры в разработке Android. У вас уже есть один объект singleton -> объект приложения. Вы можете управлять всеми «синглтон» там простым геттером и сеттером. GetsingletonObject() – Tobrun

+0

Singleton Activity? Не делай этого! – Geros

+0

Он не создает активность Singleton! Обычный подход user1281750 был бы самым простым способом. Но вы, пожалуйста, покажите нам LogCat? –

ответ

0
Log.i ("DEBUG" , currentTraining.getTitle()); 
    CurrentTraining.getInstance().setTraining(currentTraining); 

не ступали значение, как получить значение?

@Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     currentTraining = (Training)arg0.getAdapter().getItem(arg2); 
     Log.i ("DEBUG" , currentTraining.getTitle()); 

     CurrentTraining.getInstance().setTraining(currentTraining); 

     Toast.makeText(getApplicationContext(), "You clicked on position : " + arg2 + " and ID : " + currentTraining.getId(), Toast.LENGTH_LONG).show(); 
     } 
+0

Пока делаю arraylist тренировок. Я уже подготовил Training traininig = new Training(). Поэтому я не хочу снова делать новый. Вместо этого я хочу использовать тот же объект обучения. И код, который вы мне дали, не работает. :( – user3099195

+0

показать мне код с новым Training(), я не видел, где 'new Training()' is – Longwayto

+0

У меня есть класс портфолио, где у меня есть способ получить тренировки arraylist. Там я сделал новый тренинг. [Обучение обучение = новое обучение(); training.setId (cursor.getInt (курсор \t \t \t \t \t .getColumnIndex (DatabaseHelper.TRAINING_ID))); this.trainingArrayList.add (обучение);] И у меня есть getter и setter для обученияArrayList. – user3099195

0

В вашей OnCreate вы это делаете:

currentTraining = CurrentTraining.getInstance().getTraining(); 

Что, я думаю, возвращается нуль, так как вы не установили еще. При вводе onItemClick() при входе с

currentTraining.getTitle() 

, которые могли бы дать NullPointerException. Попробуйте каротаж с

Log.i ("DEBUG" , currentTraining); 

сначала, чтобы убедиться, что это не null.

+0

Я согласен с вами. Но как я могу решить эту проблему. – user3099195

+0

Установив экземпляр Training на вашем singleton CurrentTraining. Может быть, предоставить экземпляр по умолчанию, пока вы не выбрали его из списка. –

+0

Не могли бы вы помочь мне с помощью кода примера? – user3099195

0

вы получите NPE на этой линии

Log.i ("DEBUG", currentTraining.getTitle());

т.к. currentTraining есть null. Одноточечно статический метод getInstace() инициализирует instance поля, но не поле, возвращенный на getTraining()

+0

Чувак, как я могу это решить. Есть идеи? – user3099195

+0

вы должны вызвать setTraining перед вызовом getTraining.getTitle и проверкой на нулевые значения – Blackbelt

+0

@ blackbelt-- Дерьмо дает значения null для текущегоTraining. Почему так? – user3099195

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