Метод onReceive () не вызывается во фрагменте - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть Activity и 2 фрагмента. Activity имеет BottomNavigationView, который содержит 2 элемента (Fragments). В первом фрагменте пользователь вводит данные через EditText, и по нажатию кнопки я отправляю Localbroadcast , который содержит пользовательский ввод. Но когда я пытаюсь получить его во втором фрагменте, он просто не восстанавливается. Но когда я пытаюсь получить его в первом фрагменте, я получаю данные. BroadcastReceiver динамически регистрируется в onCreateView второго фрагмента. Может ли кто-нибудь помочь мне с этой проблемой? Это действительно беспокоит меня .. Ожидая вашей помощи

Fragment1:

send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                input = user_input.getText().toString();
                if (input.trim().length() != 0 && !TextUtils.isEmpty(input)) {
                    Log.e("data",input);
                    Intent intent = new Intent("send");
                    intent.putExtra("sms", input);
                    LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);

                }

FRAGMENT2:

 if (smsreceiver==null)
        {
            smsreceiver=new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    Log.e("Retreive","Retrieve");
                }
            };
            LocalBroadcastManager.getInstance(getContext()).registerReceiver(smsreceiver,new IntentFilter("send"));
        }

Вход

09-04 14:45:51.007 14829-14829/com.globemaster.com.messageapp E/data: cxs
09-04 14:45:51.857 14829-14829/com.globemaster.com.messageapp D/ViewRootImpl: ViewPostImeInputStage processPointer 0
09-04 14:45:51.937 14829-14829/com.globemaster.com.messageapp D/ViewRootImpl: ViewPostImeInputStage processPointer 1
09-04 14:45:51.977 14829-14829/com.globemaster.com.messageapp E/OnCreateView: Called
09-04 14:45:51.977 14829-14829/com.globemaster.com.messageapp D/TextView: setTypeface with style : 0
    setTypeface with style : 0
09-04 14:45:52.047 14829-14829/com.globemaster.com.messageapp E/Started: Called
09-04 14:45:52.047 14829-14829/com.globemaster.com.messageapp E/Onresume: called
09-04 14:45:52.077 14829-14829/com.globemaster.com.messageapp E/RecyclerView: No adapter attached; skipping layout

1 Ответ

0 голосов
/ 04 сентября 2018

Это не правильный способ использовать Broadcast. Вы не можете принять трансляцию, так как второй фрагмент еще не запущен. Вам следует перейти ко второму фрагменту, когда вы нажмете кнопку отправки с текстом смс в качестве аргумента.

Попробуй это. У меня это работает:

FirstFragment.java

send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                input = user_input.getText().toString();
                if (!TextUtils.isEmpty(input)) {
                    Log.d("SendFrag", "sending : "+input);
                    // Set data into fragment
                    ReceiveSmsFragment fragment = new ReceiveSmsFragment();
                    Bundle arguments = new Bundle();
                    arguments.putString("sms", input);
                    fragment.setArguments(arguments);
                    // Change fragment with argument
                    FragmentTransaction transaction=getActivity().getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.fragcontainer, fragment);
                    transaction.commit();

                } else {

                    Toast.makeText(getContext(), "Please enter a valid input", Toast.LENGTH_SHORT).show();
                }
                input = null;
            }
        });

и SecondFragment.java

@Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.e("OnCreateView","Called");

        view = inflater.inflate(R.layout.receive_sms_frag, container, false);

        Bundle arguments = getArguments();
        String sms_string = arguments.getString("sms");
        if (sms == null) {
                    sms = new Sms();
        }
        sms.add(sms_string);
        Log.d("ReceiveFrag", "received : "+sms_string);

        return view;

    }

Наконец, ваш класс смс был странным. Я выкладываю здесь лучшую версию Sms.java

public class Sms {
    private static ArrayList<String> sms_list;
    // Sms constructor with no private/public, it's a constructor !
    Sms()
    {
        sms_list = new ArrayList<>();
    }

    public void add(String sms)
    {

        sms_list.add(sms);
    }
    public String get(int position)
    {
        return sms_list.get(position);
    }
    public static int getListLength()
    {
        return sms_list.size();
    }
}

Попробуйте это и скажите мне, если это работает:)

Надеюсь, это помогло.

...