我尝试了以下线程中提到的所有方法 How to access Fragment's child views inside fragment's parent Activity?,但似乎没有一个适合我。经过一个半小时的努力,我才问这个问题。
我的类别片段
public class CategoriesFragment extends Fragment {
private TextView textView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_categories,container,false);
textView = view.findViewById(R.id.cat_text);
Log.i("Tag",textView.getText().toString());
return view;
}
public TextView getTextView(){
return textView;
}
.
.
.
}
当用户单击由“类别”标签组成的底部导航视图时,我正在打开类别片段。
我的主屏幕活动
public class HomeScreen extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener, CategoriesFragment.OnFragmentInteractionListener{
private BottomNavigationView bottomNavigationView;
private CategoriesFragment categoriesFragment;
private FrameLayout bottomFrameLayout;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_screen);
bottomNavigationView = findViewById(R.id.bottom_nav_view);
bottomFrameLayout = findViewById(R.id.bottom_nav_frame);
categoriesFragment = new CategoriesFragment();
bottomNavigationView.setOnNavigationItemSelectedListener(this);
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.bottom_nav_categories :
getSupportFragmentManager().beginTransaction().replace(R.id.bottom_nav_frame,categoriesFragment).addToBackStack(null).commit();
textView = categoriesFragment.getTextView();
textView.setText("DONE");
}
return true;
}
这将引发空指针异常,因为它无法获取“文本”视图。任何帮助/指导将不胜感激:)
答案 0 :(得分:0)
commit()
函数无法同步工作,因此您的片段在调用后将无法立即准备就绪。
摘自文档。
计划此事务的提交。提交不会立即发生;它将在下次线程准备好时安排为主线程上的工作进行安排。
使用commitNow()
,因为它可以同步工作,并且该片段已完全进入其主机的lifycycle状态。
有关更多信息,请参见https://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html#commitnow
答案 1 :(得分:-1)
当可以将字符串作为参数传递给fragment的公共方法以更改文本时,为什么要从活动中获取textview和设置文本?