java如何从片段设置活动中的公共文本视图?
我想从片段中设置活动中textview的文本。我就是这样做的
主要活动。java
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
public TextView textViewNotification;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
textViewNotification = (TextView) MenuItemCompat.getActionView(navigationView.getMenu().findItem(R.id.nav_notification));
}
}
家庭片段。java
public class HomeFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
((MainActivity)getActivity()).getSupportActionBar().setTitle("PIT IAI & FIP Regional");
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_home, container, false);
MainActivity activity = (MainActivity) getActivity();
activity.notification.setText("This is a test"); // => got error here.
return root;
}
}
但它不起作用。这是我得到的错误:
安卓.content.res.Resources$NotFoundException: String resource ID #0x1
at 安卓.content.res.Resources.getText(Resources.java:348)
at 安卓.widget.TextView.setText(TextView.java:5846)
如何从片段中获取和设置活动的公共属性?不可能吗?请帮忙
# 1 楼答案
Henry Gunawan您的MainActivity没有任何名为notification的公共字段,您实际上将其命名为textViewNotification
此外,我在你的代码中看到了一些不好的做法
避免声明公共字段,而是使用getter和setter来访问它们
您的片段假设它的主机始终是MainActivity实例,并且它有一个名为notification的字段,这不是一个好的做法,片段应该是一个独立的单元,片段不应该依赖于其主机活动的具体情况,因为它们可能是任何活动的主机,因此这是对片段的滥用,如Amr Sakr所解释的,如果您希望主机活动为您做些事情,那么use应该使用回调
# 2 楼答案
假设你想根据某个动作向活动发送文本
您可以使用一个接口,首先在片段中创建一个公共接口,并在其中添加一个方法,该方法接受一个字符串参数
,声明CommunicateWithActivity类型的全局变量mListener
然后,超越转速表和内部尝试/捕捉块
然后在活动中实现接口,在活动中重写“oncommunicate(String s)”方法,您将在方法中获得字符串