我无法使用片段从我的活动中访问片段布局内的文本视图

时间:2019-06-25 05:15:04

标签: java android android-fragments

我尝试了以下线程中提到的所有方法 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;
}

这将引发空指针异常,因为它无法获取“文本”视图。任何帮助/指导将不胜感激:)

2 个答案:

答案 0 :(得分:0)

commit()函数无法同步工作,因此您的片段在调用后将无法立即准备就绪。

摘自文档。

  

计划此事务的提交。提交不会立即发生;它将在下次线程准备好时安排为主线程上的工作进行安排。


使用commitNow(),因为它可以同步工作,并且该片段已完全进入其主机的lifycycle状态。

有关更多信息,请参见https://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html#commitnow

答案 1 :(得分:-1)

当可以将字符串作为参数传递给fragment的公共方法以更改文本时,为什么要从活动中获取textview和设置文本?