Finding Fragment View on Activity. Android findFragmentByTag(String tag) returns null

。_饼干妹妹 提交于 2019-12-05 07:28:08

问题


I'm trying to get a Spinner View from an added Fragment to my activity but it seems that I cannot get the fragment nor the view.

I have an Activity which adds a Fragment to it's LinearLayout, the fragment's layout is based on the 'extra' that comes from the intent of the Activity. Everything is displayed correctly and I can see all the views of the fragment but for some reason when I call findFragmentByTag(String tag) it returns null and thus I cannot call getView().

Here is how I am adding the fragment code to my activity:

...onCreate(){
    ...
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    Fragment fr = new Fragment(){
        @Override
        public View onCreateView(LayoutInflater inflater,
                ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(layoutID, container, false);
        }
    };
    ft.add(R.id.formsListActivity_Container, fr, "form_fragment_tag");

    ft.commit();
    ...

}

Then I try to get such fragment and get a the spinner view to add the string array:

Fragment f = fm.findFragmentByTag("form_fragment_tag");
Spinner spinner = (Spinner) f.getView().findViewById(R.id.city_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
        R.array.city_list, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

But I get a null exception because findFragmentByTag() returns null

What am I doing wrong? I've verified the code a few times and the tags are the same. I've also make sure the spinner's id is in the XML layout file correctly, and the fragment is loading the correct XML layout because I can see it (If a comment the get view from fragment part).


回答1:


I have resolved the problem, it seems that based on the life cycle of both the activity and the fragment by the time the findFragmentById() is executed in the onCreate() the fragment has not been 'actually created', I tested this by adding a simple button to the layout and making a method that when clicked on the button the spinner will be filled with data.

But of course I don't want the user to click a 'Load' button to fill the spinner, instead I have implemented on my fragment the public void onActivityCreated() method.

For reference here is my code of the fragment:

 Fragment fr = new Fragment(){

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(layoutID, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Spinner spinner = (Spinner) this.getView().findViewById(R.id.city_spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.city_list, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
    }

 };



回答2:


I had the same problem I solved it by calling the findFragmentByTag() in the

protected void onStart()
{
}

life cycle method.




回答3:


Try changing false to true in your inflate line.

return inflater.inflate(layoutID, container, true);


来源:https://stackoverflow.com/questions/9966928/finding-fragment-view-on-activity-android-findfragmentbytagstring-tag-returns

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!