在我的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();
实际上,这是有道理的,因为称为"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还是类似的东西?
答案 0 :(得分:0)
我通过使用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;
}
在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);
}
}
}
}
});