Android 如何从活动更新片段文本视图?

Android 如何从活动更新片段文本视图?,android,android-fragments,Android,Android Fragments,如果我有一个函数,它会不时地获取不同的值,并且使用片段作为显示,我想随着值的变化更新片段内的TextView,那么我如何从MainActivity内的片段操作TextView 要进一步澄清: My Main Activity将DatabaseReference中的值定义如下: userLoggedInRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@No

如果我有一个函数,它会不时地获取不同的值,并且使用片段作为显示,我想随着值的变化更新片段内的TextView,那么我如何从MainActivity内的片段操作TextView

要进一步澄清:

My Main Activity将DatabaseReference中的值定义如下:

userLoggedInRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            if (!dataSnapshot.child("office").getValue(String.class).equals("none")) {
                officeKeyLoggedIn = dataSnapshot.child("office").getValue(String.class);
                usersInOffice.child(officeKeyLoggedIn).child(userKey).setValue("").addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if(task.isSuccessful()){
                            /new-code/
                        }
                    }
                });
            }
        ...
userLoggedInRef.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
if(dataSnapshot.exists()){
如果(!dataSnapshot.child(“office”).getValue(String.class).equals(“none”)){
officeKeyLoggedIn=dataSnapshot.child(“office”).getValue(String.class);
usersInOffice.child(officeKeyLoggedIn).child(userKey.setValue(“”)addOnCompleteListener(新OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
/新代码/
}
}
});
}
...
因此,当用户进入办公室,值从“无”变为“/officeKey/”时,这里是一个条件,此时我想调用“/new code/”片段,它是MainActivity的显示,将隐藏文本视图的可见性设置为可见,并将其文本设置为通知用户他现在已登录的内容

我怎样才能做到这一点

EDIT1:

在您的活动中 您必须初始化此片段(例如,作为字段):

记住在事务中使用这个实例(使用
FragmentManager

片段: 接下来,在片段中,您可以创建接收数据的新方法:

public class OwnFragment extends Fragment {

    // So you can pass there: View.VISIBLE, View.GONE or View.INVISIBLE
    void setVisibility(int visibility) {
        textView.setVisibility(visibility);
    }

    // Your new method
    void setNewText(String text) {
        textView.setText(text);
    }

}
再次在活动中: 您可以使用上述片段实例调用此方法:

fragment.setNewText("Hello world");
在你的活动中 您必须初始化此片段(例如,作为字段):

记住在事务中使用这个实例(使用
FragmentManager

片段: 接下来,在片段中,您可以创建接收数据的新方法:

public class OwnFragment extends Fragment {

    // So you can pass there: View.VISIBLE, View.GONE or View.INVISIBLE
    void setVisibility(int visibility) {
        textView.setVisibility(visibility);
    }

    // Your new method
    void setNewText(String text) {
        textView.setText(text);
    }

}
再次在活动中: 您可以使用上述片段实例调用此方法:

fragment.setNewText("Hello world");

将此逻辑移动到共享ViewModel,这是您可以在作为解决方案提供的代码中看到的,这样您就不必再关心它是活动还是片段,因为它将通过Observer共享给这两者pattern@on-我的开发生活之路你想把数据从一个活动传递到另一个片段吗?@Boken不,我想从活动中的片段操作文本视图
textview
位于
activity
中。是否要从
fragment
设置文本(在此
textview
),对吗?@EpicPandaForce我稍后会检查您的答案,现在我没有时间实施(我也会删除此选项)将此逻辑移动到共享ViewModel,这是您可以在作为解决方案提供的代码中看到的,这样您就不必再关心它是活动还是片段,因为它将通过Observer共享给这两者pattern@on-我的开发生活之路你想把数据从一个活动传递到另一个片段吗?@Boken不,我想从活动中的片段操作文本视图
textview
位于
activity
中。是否要从
fragment
设置文本(在此
textview
),对吗?@EpicPandaForce我稍后会检查您的答案,现在我没有时间实施(我也会删除此内容)Boken,它给出了错误“尝试在空对象引用上调用虚拟方法'void android.widget.TextView.setVisibility(int)'”
片段中的函数是public void setTxtOfficeLoggedIn(String officeName){txtOfficeLoggedIn.setVisibility(View.VISIBLE);txtOfficeLoggedIn.setText(“Vocêestálogado em:+officeName);}即使第一行(txtOfficeLoggedIn.setVisibility(…)被注释,错误也会显示
null object reference
您是否使用相同的片段?您是否会修改您的问题并添加活动的代码(与
fragmentManager
一起)和片段?您是否忘记提到“TextView TextView-(TextView)findViewbyId?”(R.id.);“?Boken,它给出的错误是“试图在空对象引用上调用虚拟方法'void android.widget.TextView.setVisibility(int)'”
片段中的函数是public void setTxtOfficeLoggedIn(String officeName){txtOfficeLoggedIn.setVisibility(View.VISIBLE);txtOfficeLoggedIn.setText(”Vocêestálogado em:“+officeName);}即使第一行(txtOfficeLoggedIn.setVisibility(…))被注释,错误也会说
null对象引用
您使用的是同一个片段吗?您会修改您的问题并添加活动的代码(与
fragmentManager
一起)和片段吗?您忘了提及吗?”TextView TextView-(TextView)findViewbyId(R.id.);“?