onReceive() 方法未在片段中调用
onReceive() method is not called in a Fragment
我有一个 Activity 和 2 fragments.The Activity 有一个包含 2 个项目(片段)的 BottomNavigationView。在第一个片段中,用户通过 EditText 输入数据并单击按钮当我尝试在第二个片段中接收它时,我发送了一个包含用户 input.But 的 Localbroadcast,它根本没有被检索到。但是当我尝试在第一个片段中检索它时,我得到 data.The BroadcastReceiver 在第二个片段的 onCreateView 中动态注册。谁能帮我解决这个问题?这真的很烦我..期待你的帮助
片段 1:
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);
}
片段 2:
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
这不是使用广播的正确方法。您无法接收广播,因为第二个片段尚未开始。当您单击以短信文本作为参数的发送按钮时,您应该更改为第二个片段。
试试这个。它对我有用:
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;
}
最后,您的短信 class 很奇怪。我post这里有更好的版本
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();
}
}
试试这个,告诉我它是否有效:)
希望对您有所帮助。
我有一个 Activity 和 2 fragments.The Activity 有一个包含 2 个项目(片段)的 BottomNavigationView。在第一个片段中,用户通过 EditText 输入数据并单击按钮当我尝试在第二个片段中接收它时,我发送了一个包含用户 input.But 的 Localbroadcast,它根本没有被检索到。但是当我尝试在第一个片段中检索它时,我得到 data.The BroadcastReceiver 在第二个片段的 onCreateView 中动态注册。谁能帮我解决这个问题?这真的很烦我..期待你的帮助
片段 1:
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);
}
片段 2:
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
这不是使用广播的正确方法。您无法接收广播,因为第二个片段尚未开始。当您单击以短信文本作为参数的发送按钮时,您应该更改为第二个片段。
试试这个。它对我有用:
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;
}
最后,您的短信 class 很奇怪。我post这里有更好的版本 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();
}
}
试试这个,告诉我它是否有效:)
希望对您有所帮助。