Access Fragment View from Activity's onCreate
Update your views in onCreateView()
.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.event_log, container, false);
TextView tv = (TextView) view.findViewById(R.id.text);
tv.setText("hello world");
return view;
}
Or if your changes depend on Activity
your Fragment
is attached to, use onActivityCreated()
.
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
TextView tv = (TextView) getView().findViewById(R.id.text);
tv.setText(getActivity.getSomeText());
}
Dan
Updated on September 03, 2020Comments
-
Dan over 3 years
I am in the process of making my first app for Android, and I have a
Fragment
that gets added to myActivity
in theActivity
'sonCreate()
method. The problem I am facing is that I am unable to find any of the views contained within theFragment
from theActivity
'sonCreate()
method.Other threads have suggested that this is because the
Fragment
has not yet been inflated, sofindViewById()
will return null for any views contained within theFragment
.Here is what I mean:
Activity:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println("activity onCreate"); setContentView(R.layout.activity_main); if (savedInstanceState != null) { return; } initialiseUI(); // Fragment added to Activity System.out.println("end of activity onCreate"); }
Fragment:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { System.out.println("fragment onCreateView"); return inflater.inflate(R.layout.event_log, container, false); }
This prints the results:
activity onCreate end of activity onCreate fragment onCreateView
Because of this order, any attempt to access the views of the
Fragment
in theActivity
'sonCreate()
method (usingfindViewById()
) produces aNullPointerException
, as theFragment
'sonCreateView()
only gets called AFTER the end of theActivity
'sonCreate()
.Using the
FragmentManger
'sexecutePendingTransactions()
after adding theFragment
doesn't help.Basically, I have been forced to put the problem code in the
Activity
'sonStart()
method instead ofonCreate()
, asonStart()
happens AFTER theFragment
'sonCreateView()
.Does anyone what the standard practice here is, or how I can make my Fragment-View-accessing code work within the
Activity
'sonCreate()
method? -
Dan over 11 yearsOk, after a million other problems that I won't go into, I finally got this working properly! Thank you for your help.
-
Mike Mackintosh over 11 years@Dan, can you share exactly the other problems and how you used the above to solve it? It would be a great contribution ot the community.
-
Dan over 11 yearsBasically, I tried using onActivityCreated() to initialise my components, thinking this method would only be called once. This caused a lot of problems when pausing and restarting my app, as this method was resetting all of my components, since it gets called each time. Then, when trying to make this work using onCreateView(), I used getView().findViewById(...) rather than using the already-initialised "view" variable. It was a silly mistake, but I got there in the end! So now the text is stored to a field in onCreate(), and put into the TextView in onCreateView().
-
Dr.jacky almost 10 yearsPlease see my related question: stackoverflow.com/questions/24833912/…