Как фрагмент должен прослушивать данные из действия? - PullRequest
0 голосов
/ 26 июня 2018

в моем приложении для Android у меня есть этот класс под названием «TripleTab2».TripleTab2 - это фрагмент, который вызывается как часть действия с вкладками.

public class TripleTab2 extends Fragment {

private TextView nameAndNumberText;
private LinearLayout nameAndNumbersLayoutSMS;

private Map<String, String> nameToNumberMapping;
private View view;
private ArrayList<String> chosenSMSContacts;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.assign_pattern_tab_2, container, false);
    nameAndNumberText = (TextView) view.findViewById(R.id.numAndNameView);
    nameAndNumbersLayoutSMS = (LinearLayout) view.findViewById(R.id.nameAndNumbersLayoutSMS);
    chosenSMSContacts = getArguments().getStringArrayList("numbersToMove");
    createTextViews();

    for(String chosenSMSContact : chosenSMSContacts){
        nameAndNumberText.append(chosenSMSContact);
    }

    return view;
}

Следующая строка кода вызывает проблему (NullPointerException) :

chosenSMSContacts = getArguments().getStringArrayList("numbersToMove");
        createTextViews();

На самом деле это имеет смысл, потому что класс actvity называется "ChooseSMSContactActivity" (который отправляет эти данные) вызывается после tripleTab2-class.

Вот оно:

public class ChooseSMSContactActivity extends AppCompatActivity {

private LinearLayout nameAndNumbersLayoutSMS;
private Map<String, String> nameToNumberMapping;
private Button selectedNumberBtn;
private ArrayList<String> selectedNamesAndNumbers;

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

    nameAndNumbersLayoutSMS = (LinearLayout) findViewById(R.id.dropDownMenuLayout);
    selectedNumberBtn = (Button) findViewById(R.id.selectedNumberBtn);
    createCheckboxes();
    selectedNamesAndNumbers = new ArrayList<>();


    selectedNumberBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            for(int i=0; i < nameAndNumbersLayoutSMS.getChildCount(); i++){
                if(nameAndNumbersLayoutSMS.getChildAt(i) instanceof CheckBox){
                    CheckBox checkBox = (CheckBox) nameAndNumbersLayoutSMS.getChildAt(i);

                    if(checkBox.isChecked()){
                        selectedNamesAndNumbers.add(checkBox.getText().toString());
                        Bundle bundle = new Bundle();
                        bundle.putStringArrayList("numbersToMove", selectedNamesAndNumbers);
                        TripleTab2 tripleTab2 = new TripleTab2();
                        tripleTab2.setArguments(bundle);
                    }
                }
            }
        }
    });


}

Итак, TripleTab2 не имеет этих данных при создании, потому что он вызывается до ChooseSMSContactActivity.

У кого-нибудь есть предложения, как решить эту проблему?Должен ли я использовать BroadcastReceiver или что-то подобное?

1 Ответ

0 голосов
/ 26 июня 2018

Я решил это с помощью библиотеки EventBus.

В TripleTab2 был зарегистрирован EventBus и создан метод onEvent:

EventBus.getDefault().register(this);

@Subscribe
public void onEvent(CustomMessageEvent event){
    TextView nameAndNum = new TextView(view.getContext());
    nameAndNum.append(event.getCustomMessage());
    nameAndNumbersLayoutSMS.addView(nameAndNum);
}

Класс CustomMessageEvent выглядит следующим образом:

public class CustomMessageEvent {

private String customMessage;

public String getCustomMessage() {
    return customMessage;
}

public void setCustomMessage(String customMessage) {
    this.customMessage = customMessage;
}

В кнопку onClickListener в ChooseSMSActivity я добавил событие EventBus:

selectedNumberBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            for(int i=0; i < nameAndNumbersLayoutSMS.getChildCount(); i++){
                if(nameAndNumbersLayoutSMS.getChildAt(i) instanceof CheckBox){
                    CheckBox checkBox = (CheckBox) nameAndNumbersLayoutSMS.getChildAt(i);

                    if(checkBox.isChecked()){
                        selectedNamesAndNumbers.add(checkBox.getText().toString());
                        CustomMessageEvent event = new CustomMessageEvent();
                        event.setCustomMessage(checkBox.getText().toString());
                        EventBus.getDefault().post(event);
                    }
                }
            }
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...