使用 findViewById 在片段中的 Textview 上的 Bundle 中设置文本时出现 NullPointerException class

NullPointerException when using findViewById to set text from a Bundle on Textview in a Fragment class

我在各种站点和堆栈溢出问题上研究了这个问题,但找不到解决我问题的解决方案。我已经为这个问题苦苦挣扎了一段时间,但就是无法解决..

我有两个活动和一个片段。 第一个 Activity(概述)应该在 t 的 onCreate 中添加片段,其文本与默认文本不同。第二个 Activity (AddCity) 使用 Intent 和 Bundle 将此文本数据发送到 Overview。在概述中,数据可用,我使用 myfragment.setArguments(bundle) 将其发送到片段,但是当我尝试使用 Bundle bundle = getArguments() 访问 onCreateView 中的 Textview 时,出现以下错误:

FATAL EXCEPTION: main
     Process: com.myapp.www, PID: 19690
     java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

异常发生在 StatusFragment 中的以下行:

TextView cityText = (TextView) getView().findViewById(R.id.city_name);

我已经尝试过使用自己的构造函数的方法,但据我所知,除了片段中的空默认构造函数之外,你应该避免使用自定义构造函数,但它也没有用。

我的 class 是:

概览:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_overview);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setIcon(R.drawable.myicon);
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);

        if(getIntent().getExtras() != null){
            Bundle extras = getIntent().getExtras();

            StatusFragment newFragment = new StatusFragment();
            newFragment.setArguments(extras);

            mSectionsPagerAdapter.addFragment(newFragment, extras.getString("city"));
        }else{
            Log.w("Overview-Bundle", "No Bundle Data");
        }

        mViewPager.setAdapter(mSectionsPagerAdapter);
    }

添加城市:

这个 class 使用一种方法来接收 JSON 字符串并解析它以获取我需要发送到片段的数据。这很好用,所以我只给出了我放在 Intent 中的相关代码。 obj 是 JSON 对象。 (如果您需要更多代码,请告诉我)

Intent i = new Intent(AddCity.this, Overview.class);
                    Bundle bundle = new Bundle();
                    bundle.putString("city", obj.getString("user_city"));
                    bundle.putString("country", obj.getString("user_ country"));
                    i.putExtras(bundle);
                    startActivity(i);

状态片段:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_for_overview, null);

        setUI(view);

        return view;
    }

    public void setUI(View view){
        if(getArguments() != null) {

            Bundle bundle = getArguments();

            String city = bundle.getString("city");
            String country = bundle.getString("country");

            TextView cityText = (TextView) getView().findViewById(R.id.city_name);
            TextView countryText = (TextView) getView().findViewById(R.id.country_name);

            cityText.setText(city);
            countryText.setText(country);

        }else{
            Log.w("Arguments", "no arguments");
        }
    }

我将不胜感激每一个答案。让我知道我是否应该 post 更多代码。

您在 onCreateView() 返回之前调用 getView(),因此是空指针。在你的情况下,你可以简单地调用:

public void setUI(View view){
    ...
    TextView cityText = (TextView) view.findViewById(R.id.city_name);
    ...
}