使用findViewById在Fragment类

时间:2016-08-27 17:11:07

标签: java android android-fragments nullpointerexception findviewbyid

我在各种网站上研究了这个问题,这里有关于堆栈溢出的问题,但我找不到解决我问题的解决方案。我现在正在努力解决这个问题已经有一段时间了但是无法解决它..

我有两个活动和一个片段。 第一个Activity(概述)应该使用不同的文本添加片段在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);

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

我的课程是:

概述:

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);
    }

AddCity:

此类使用一种方法接收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);

StatusFragment:

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");
        }
    }

我会感激每一个答案。如果我发布更多代码,请告诉我。

1 个答案:

答案 0 :(得分:2)

您在getView()返回之前调用onCreateView(),因此为空指针。在您的情况下,您只需致电:

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