代码之家  ›  专栏  ›  技术社区  ›  Nora

片段应该如何监听来自活动的数据?

  •  0
  • Nora  · 技术社区  · 7 年前

    在我的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;
    }
    

    下面的代码行导致了一个问题 (空指针异常) 以下内容:

    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 是的。

    有人对如何解决这个问题有什么建议吗?我应该用广播接收器还是类似的东西?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Nora    7 年前

    我用eventbus库解决了这个问题。

    在TrimePab2事件总线上注册,并创建了一个OnEnter方法:

    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);
                        }
                    }
                }
            }
        });
    
    推荐文章