正在将对象发送到Fragment



我正在尝试将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 
}
}
});

欲了解更多信息,请查看官方文档

最新更新