为什么在Activity中访问Fragment的TextView会抛出错误

为什么在Activity中访问Fragment的TextView会抛出错误

问题描述:

MainActivity class:

/* all necessary imports */

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    /* Other variable initialized here... */
    FragOne fo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        fo.setTextViewText("This is added from Activity");

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }


    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new FragOne(), "My Tracker");
        adapter.addFragment(new FragTwo(), "Team Tracker");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}

片段 class:

/* all necessary imports */
public class FragOne extends Fragment {

    TextView tvCName;

    public FragOne() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_frag_one, container, false);

        return view;
        //return inflater.inflate(R.layout.fragment_frag_one, container, false);
    }

    @Override
    public void onViewCreated(View view , Bundle savedInstanceState) {
        tvCName = (TextView) view.findViewById(R.id.tvctq);
    }

    public void setTextViewText(String value){
        tvCName.setText(value);
    }

}

片段 XML布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.mytip.FragOne">

        <TextView
            android:text="TextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tvctq" />
</FrameLayout>

我正在尝试访问 TextView 里面来自 MainActivity Fragment 是这样的:

I am trying to access the TextView inside the Fragment from MainActivity like this:

FragOne fo;
fo.setTextViewText("This is added from Activity");

我一直得到 NullPointerExceptionError 。我查看了所有文章以了解如何访问,但是他们都没有帮助我。

I keep getting a NullPointerExceptionError. I looked at all the articles to see how to access, however none of them helped me.

有人可以让我知道我做错了什么以及如何解决它?

Can someone please let me know what am I doing wrong and how to fix it?

我还打算在我的片段$ c中添加其他查看 $ c>我将来需要访问。

I also plan on adding other Views inside my Fragment that I would need to access in the future.

因为 fo 尚未在以下代码段中初始化:

Because fo hasn't been initialized in the following code snippet:

FragOne fo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    fo.setTextViewText("This is added from Activity");
    ...
}

fo.setTextViewText ()合理抛出 NPE