您可以将Intents and Intent Filters 与Broadcast Receiver 一起使用
为此。
- 在要更新数据的片段中创建一个 BroadcastReceiver 实例。
- 创建一个 IntentFilter 并为其设置一个操作字符串(可能是“db.update”)并将其注册到您的应用程序上下文中(您可以通过调用 getActivity().getApplicationContext().registerReceiver 通过您的片段执行此操作(接收器,过滤器)。
- 在您的 AlertDialog 中,更新数据库后,使用您在上面设置的相同操作字符串(在我们的示例中为“db.update”)创建一个 Intent,并使用上下文将其发送出去(getActivity(). getApplicationContext().sendBroadcast(intent))。您的 BroadcastReceiver 的 onReceive() 方法将在您的片段中调用,您可以调用该方法来刷新或重新加载您的数据。请参阅下面的示例代码:
说这是你的片段
public class YourFragment extends Fragment {
private GridView mGridView;
private BaseAdapter mAdapter;
private BroadcastReceiver mReceiver;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//inflate view as usual
View view = inflater.inflate(R.layout.yourlayour, container, false);
...
//create instance of broadcast receiver
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) { //when intent is receiver, this method is called
if(intent.getAction().contentEquals("db.update")){
//update intent received, call method to refresh your content loader
refreshFragment();
}
}
};
//create a new intent filter
IntentFilter mDataUpdateFilter = new IntentFilter("db.update");
//register our broadcast receiver and intent filter
getActivity().getApplicationContext().registerReceiver(mReceiver, mDataUpdateFilter);
return view;
}
@Override
public void onDestroy() {
super.onDestroy();
//never forget to unregister the receiver when you're done, it could cause your app to crash
//if it receives an intent and calls null pointing methods in your code
getActivity().getApplicationContext().unregisterReceiver(mReceiver);
} }
然后像上面一样在您的 AlertDialog 中,通过以下方式将意图发送到此接收器:
DataBaseHelper dbh = DataBaseHelper(this);
...
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbh.addVal(new TheData(editName.getText().toString(), editAge.getText().toString())); //adds a row to the Sqlite Db
//Create an intent with our action
Intent updateIntent = new Intent("db.update");
//send the intent by
getContext().getApplicationContext().sendBroadcast(updateIntent);
dialog.dismiss();
}
});
...
当您的片段被销毁时,不要忘记取消注册您的广播接收器。在您的 onDestroy() 方法中调用 getActivity().getApplicationContext().unregisterReceiver(receiver);。
我还应该指出,您的广播接收器的 onReceive() 方法将始终在主线程上调用,即使您从后台线程发送您的意图。