>

안드로이드 앱에 "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();

액티비티 클래스는 "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

    EventBus 라이브러리를 사용하여이 문제를 해결했습니다.

    TripleTab2에 EventBus가 등록되었고 onEvent-method가 생성되었습니다 :

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

    ChooseSMSActivity의 onClickListener 버튼에서 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);
                        }
                    }
                }
            }
        });
    
    

관련 자료

  • 이전 Dart에서 기본 개인 생성자를 사용하여 클래스를 확장 할 수 있습니까?
  • 다음 symfony - VichUploader 다양한 이미지 업로드 번들 및 양식