我是初学者,在做的时候尝试学习,而谷歌的结果对我来说太复杂了。
我有一个活动,并成功设法通过按下按钮打开和关闭片段。
public void pressedButton(View v) {
FragmentActivity fragmentActivity = new FragmentActivity();
FragmentManager fragmentManager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(R.id.frame_which_takes_the_fragment, FragmentActivity, "FRAGMENT_TAG");
ft.commit();
正如片段类规定的那样,我在Activity中实现了它的“OnFragmentInteractionListener”接口并覆盖了onFragmentInteraction方法。
@Override
public void onFragmentInteraction(Uri uri) {
}
现在我不知道如何进步。如何将活动中的变量发送到片段(例如更新用户界面中的数字)以及如何发回信息?
请记住,我是一个血腥的初学者,并尽量保持基本和简单。
提前致谢
答案 0 :(得分:3)
那么,您已经在片段中创建了一个接口并在活动中实现了它?然后,您只需根据需要创建界面。 onFragmentInteraction(Uri uri)
方法只是一个示例,如果您不想将片段中的Uri传递给活动,则可以将其删除。
因此,要传递一个数字,您的界面可能如下所示:
interface Listener {
void onNumberChanged(int number);
}
相关的片段代码:
listener.onNumberChanged(someNumber);
相关活动代码:
@Override
public void onNumberChanged(int number) {
someTextView.setText(Integer.toString(number));
}
答案 1 :(得分:3)
发布ViewModel
后,您可以使用shared ViewModel
在片段和活动之间进行通信。您只需要在ViewModel
范围内创建activity
,ViewModel
将与activity
和所有子fragment
共享。
SharedViewModel sharedViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel::class.java);
然后只观察数据
sharedViewModel.inputNumber.observe(this, observer); // observer is your observer object
答案 2 :(得分:0)
如何将活动中的变量发送到片段(对于 在用户界面中更新号码的示例)?
我试图通过从适配器获取ListFragment并调用fragment方法来做到这一点,但出现了此错误:
IllegalStateException:无法从分离的片段访问ViewModels
我的解决方案是改用LocalBroadcastManager:
活动代码
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
Intent broadcastIntent = new Intent("MAP_SETTINGS_CHANGED");
broadcastIntent.putExtra("NUMBER_TO_SHOW_IN_FRAGMENT", 11);
localBroadcastManager.sendBroadcast(broadcastIntent);
ListFragment / Fragment代码
private Context mContext;
private BroadcastReceiver mBroadcastReceiver;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, Intent intent) {
String action = intent.getAction();
if ("MAP_SETTINGS_CHANGED".equals(action)) {
int numberToShow = intent.getIntExtra("NUMBER_TO_SHOW_IN_FRAGMENT", -1);
showNumber(numberToShow);
}
}
};
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(mContext);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("MAP_SETTINGS_CHANGED");
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
}
@Override
public void onDetach() {
super.onDetach();
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(mContext);
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
mContext = null;
}
答案 3 :(得分:0)
同一活动的两个片段之间有多种通信方式。
mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
的ViewModel绑定到视图。因此,如果我们使用 this 关键字,则ViewModel的范围将一直保留到仅碎片被破坏为止,一旦碎片被破坏,ViewModel也将被清除。因此,如果我们将 getActivity()用作ViewModel的范围,则ViewModel将保留到Activity被销毁为止。现在假设,您有一个 A 片段的 ViewModelA ,并且您希望将一些值从 A 传递给 B 片段strong>,现在您可以做的是,可以将 B 片段绑定到 ViewModelB 以及 ViewModelA ,因此您可以观察到任何更改片段 B 中 ViewModelA 的特定值。 答案 4 :(得分:0)
ViewModels方法:
片段可以使用其活动范围来共享 ViewModel 来处理这种通信,如以下示例代码所示: 这在Google的官方文档中有明确说明。 https://developer.android.com/topic/libraries/architecture/viewmodel#sharing
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
model.getSelected().observe(this, { item ->
// Update the UI.
});
}
}
enter code here
另一个很好的博客来研究此内容: 在Android应用中的Fragment和Activity之间进行通讯的8种方法。 https://hackernoon.com/8-ways-to-communicate-between-fragment-and-activity-in-android-apps-235b60005d04