2015-06-14 2 views
0

Моя активность создает фрагменты динамически, и они не создаются сразу же после запуска (скрыты). Поэтому мне нужно в основном идентифицировать свои фрагменты, чтобы я мог отправлять данные из них и из них. Я продолжаю получать ссылку на нулевой объект при попытке вызвать функцию фрагмента (addAthleteToList) из моего основного действия. Говорит, что мой объект спортсмена равен нулю. Я правильно определяю (создаю) ссылки на фрагменты? СпасибоЯ правильно использую findFragmentByTag

Если нет, как создать теги для моих фрагментов?

Основная функция Деятельность, которая передает данные фрагмента B (AthletesList):

// Interface function 
// Sends athlete information to athlete list 

@Override 
public void send(Athlete athlete) { 
    Log.e("", "Main Activity: " + athlete.getFirstName()); 
    AthletesList athletesList = (AthletesList) getSupportFragmentManager().findFragmentByTag("athleteList"); 

    ArrayList<String> athleteEvents = new ArrayList<String>(); 
    athleteEvents = athlete.getEvents(); 

    for(int i = 0; i < athleteEvents.size(); i++) { 
     Log.e("", "Athlete Event: " + athleteEvents.get(i).toString()); 
     switch (athleteEvents.get(i).toString()){ 
      case "4 x 400": 
       athletesList.addAthleteToList(athlete, 1); 
       break; 
      case "1-Mile": 
       break; 
      case "100-Meter": 
       break; 
     } 
    } 
} 

Фрагмент A:

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    btnAddAthlete.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Athlete athlete = new Athlete(); 
      athlete.setFirstName(editFirstName.getText().toString()); 
      athlete.setLastName(editLastName.getText().toString()); 
      athlete.setAge(Integer.parseInt(editAge.getText().toString())); 
      athlete.setEvents(athleteEvents); 
      athlete.setGrade(editGrade.getText().toString()); 
      athlete.setTier(Integer.parseInt(editTier.getText().toString())); 

      Log.e("", "Athlete Name: " + athlete.getFirstName() + " " + athlete.getLastName()); 

      AthletesList athletesList = new AthletesList(); 
      FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
      transaction.replace(R.id.frameLayout, athletesList, "athletesList").commit(); 
      // interface sends athlete to main activity 
      communicator.send(athlete); 
     } 
    }); 
} 

ответ

1

Ваше FragmentTag значение отличается

Набор тегов показывает "athletesList"

transaction.replace(R.id.frameLayout, athletesList, "athletesList").commit();  

Get Tag показывает "athleteList"

AthletesList athletesList = (AthletesList) getSupportFragmentManager().findFragmentByTag("athleteList"); 

athletesList!=athleteList, поэтому ваши findFragmentByTag возвращает null.

для лучшего решения, создать открытое поле постоянного, которые вы можете использовать, чтобы помечать фрагмент, например:

public static final String TAG_FRAGMENT_ATHLETELIST = "tag_athletelist";

затем использовать его в качестве fragmentTag:

SET

transaction.replace(R.id.frameLayout, athletesList, TAG_FRAGMENT_ATHLETELIST).commit(); 

GET

AthletesList athletesList = (AthletesList) getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT_ATHLETELIST); 
Смежные вопросы