我想从片段中设置活动文本视图的文本。这就是我的方法。
MainActivity.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));
}
}
HomeFragment.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;
}
}
但是它没有用。这是我得到的错误:
android.content.res.Resources$NotFoundException: String resource ID #0x1
at android.content.res.Resources.getText(Resources.java:348)
at android.widget.TextView.setText(TextView.java:5846)
如何从片段中获取并设置活动的公共属性?不可能吗请帮助。
假设您想基于某些操作将文本发送到活动。
您可以使用接口,首先在片段中创建一个公共接口,并在其中添加一个使用一个字符串参数的方法
public interface CommunicateWithActivity{
void onCommunicate(String s)
}
,声明类型为CommunicateWithActivity的全局变量mListener,
private CommunicateWithActivity mListener;
然后覆盖onAttach和try / catch块内部
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
mListener = (CommunicateWithActivity) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() + "CommunicateWithActivity implementation in Activity is required");
}
}
然后在活动中实现接口,在活动中实现重写“ onComunicate(String s)”方法,您将在方法内部获取字符串。
@Override
public void onCommunicate(String s) {
//do whatever you want
}
[Henry Gunawan您的MainActivity没有任何名为通知的公共字段,您实际上将其命名为textViewNotification。
此外,我在您的代码中看到一些不良做法
避免声明公共字段,而使用getter和setter来访问它们
您的片段假定它的主机始终是MainActivity实例,并且具有一个称为notification的字段,这不是一个好习惯,片段是作为独立单元使用的,片段不应依赖于其主机活动的详细信息,例如它们可能是任何活动的宿主,因此这是对片段的滥用,如果您希望宿主活动为您做某事,如Amr Sakr所述,请改用回调。