我正在尝试将MainActivity的值发送到HomeFragment。我创建了一个带有底部导航的新项目,我在主要活动中从firebase中查找数据,我需要在从firebase查找数据后将数据发送到HomeFragment。我用捆绑包做那个,但我做不到。我该怎么解决这个问题?
感谢
这是我的主要活动
public class MainActivity extends AppCompatActivity {
String age= "12";
String şifre;
ArrayList<String> list=new ArrayList<>();
FirebaseFirestore firebaseFirestore;
FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FirebaseApp.initializeApp(MainActivity.this);
firebaseFirestore=FirebaseFirestore.getInstance();
getDatafromFireBase();
BottomNavigationView navView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
}
public String getMyData(){
return şifre;
}
public void getDatafromFireBase(){
DocumentReference documentReference=(DocumentReference) firebaseFirestore.collection("Şifre").document("Şifre");
documentReference.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
if (error!=null){
}
if (value!=null){
Map<String,Object> map=value.getData();
Number şifre1=(Number) value.get("Şifre");
şifre=String.valueOf(şifre1);
HomeFragment homeFragment=new HomeFragment();
System.out.println(şifre+"98");
Bundle bundle=new Bundle();
bundle.putString("Şifre",şifre);
homeFragment.setArguments(bundle);
}
}
});
}
}
这是我的HomeFragment
public class HomeFragment extends Fragment {
private HomeViewModel homeViewModel;
String name;
ArrayList<String> list2;
String şifre;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
list2=new ArrayList<>();
FirebaseApp.initializeApp(getContext());
}
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_home, container, false);
final TextView textView = root.findViewById(R.id.text_home);
textView.setText(name);
String deneme = getArguments().getString("Şifre");
textView.setText(deneme);
System.out.println(deneme);
return root;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
如果您的片段已经创建,则在附加片段时只调用onCreateView()
方法一次,当您从"活动"接收数据时,不调用getArgumens()
的内容。
因此,在这种情况下,我建议您使用ViewModel来与您的Fragment进行通信。
首先,你需要在你的建筑中添加这个Dependencie。gradel:
implementation "androidx.lifecycle:lifecycle-viewmodel:2.3.1"
然后创建一个扩展ViewModel:的类
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class LiveDeneme extends ViewModel {
private final MutableLiveData<String> mutableLiveData = new MutableLiveData<>();
public void addDeneme(String deneme) {
mutableLiveData.setValue(deneme);
}
public LiveData<String> getDeneme() {
return mutableLiveData;
}
}
在"活动"中,初始化onCreate()
方法内部的ViewModel:
private LiveDeneme provider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
provider = new ViewModelProvider(this).get(LiveDeneme.class);
/*
Rest of your Code
*/
}
当你发送数据时,使用它如下:
public void getDatafromFireBase(){
DocumentReference documentReference=(DocumentReference) firebaseFirestore.collection("Şifre").document("Şifre");
documentReference.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
if (error!=null){
}
if (value!=null){
Map<String,Object> map=value.getData();
Number şifre1=(Number) value.get("Şifre");
şifre=String.valueOf(şifre1);
// send the data with this line
provider.addDeneme(sifre);
}
}
});
}
最后,要从你的碎片中接收数据,请使用下面这样的观察者:
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_home, container, false);
final TextView textView = root.findViewById(R.id.text_home);
textView.setText(name);
LiveDeneme liveDeneme = new ViewModelProvider(requireActivity()).get(LiveDeneme.class);
liveDeneme.getDeneme().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(String deneme) {
textView.setText(deneme);
}
});
return root;
}
更新
对于发送ArrayList<String>
,ViewModel类应该如下所示:
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import java.util.ArrayList;
public class LiveDeneme extends ViewModel {
private final MutableLiveData<ArrayList<String>> mutableLiveData = new MutableLiveData<>();
public void addDeneme(ArrayList<String> deneme) {
mutableLiveData.setValue(deneme);
}
public LiveData<ArrayList<String>> getDeneme() {
return mutableLiveData;
}
}
然后从你的活动中发送这个列表,你只需要这样做:
provider.addDeneme(yourList)
最后在你的片段中背诵这个列表:
LiveDeneme liveDeneme = new ViewModelProvider(requireActivity()).get(LiveDeneme.class);
liveDeneme.getDeneme().observe(getViewLifecycleOwner(), new Observer<ArrayList<String>>() {
@Override
public void onChanged(ArrayList<String> strings) {
for (String s : strings) {
System.out.println(s); // here I print all the element of the list
}
}
});
欲了解更多信息,请查看官方文档