Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getView returning null when fragment has been created from an activity

I have a working tablet application which I am now trying to make work on phones too. On a table there is two fragments on the screen a list fragment and a details fragment. When on a phone the list fragment appears and creates a new activity when a list item is pressed. This activity simply creates the fragment in the onCreate() method and commits it to the screen as follows.

// Place an DeallDetailsFragment as our content pane
DealDetailsFragment f = new DealDetailsFragment();
getFragmentManager().beginTransaction().add(android.R.id.content, f).commit();
getFragmentManager().executePendingTransactions();

This is working as expected however from within this activity I need to tell the fragment what details to load and display. In my DealDetailsFragment class I have a updateDeal() method which updates the content as follows.

if (deal==null) { // could be null if user presses the loading deals list item before it loads
    return;
}
this.deal=deal;
if (dealTitle==null) { // get the view objects only once
    holder = new ViewHolder();  
    holder.dealHeat=(TextView) getView().findViewById(R.id.dealDetails_heat_textView);
    holder.dealPrice=(TextView) getView().findViewById(R.id.dealDetails_price_textView);
    holder.dealRetailer=(TextView) getView().findViewById(R.id.dealDetails_retailer_textView);
    holder.dealTitle=(TextView) getView().findViewById(R.id.dealDetails_title_textView);
    holder.dealDesc=(TextView) getView().findViewById(R.id.dealDetails_desc_textView);
    holder.goToButton= (LinearLayout) getView().findViewById(R.id.dealDetails_goToDeal);
    holder.dealImage=(ImageView) getView().findViewById(R.id.dealDetails_imageView);
    holder.postedBy=(TextView) getView().findViewById(R.id.dealDetails_poster_textView);
    holder.datePosted=(TextView) getView().findViewById(R.id.dealDetails_date_textView);

getView() is returning null when the application is ran on a phone where there is only a single fragment shown.

Any ideas? Unfortunately, there is not many fragment examples available online.

like image 758
bencallis Avatar asked Feb 28 '12 19:02

bencallis


3 Answers

Move your method call to be executed during onCreateView, and use the view you are inflating for reference instead of getView(). See the fragment lifecycle for more information: https://developer.android.com/guide/components/fragments.html#Creating

and the documentation of getView() that explains why it returns null before onCreateView(LayoutInflater, ViewGroup, Bundle) returns:

getView() Get the root view for the fragment's layout (the one returned by onCreateView(LayoutInflater, ViewGroup, Bundle)), if provided.

https://developer.android.com/reference/android/app/Fragment.html#getView()

like image 58
Jason Robinson Avatar answered Nov 10 '22 09:11

Jason Robinson


Moving the method to onCreateView() did not help me.so... Create a global variable mView

protected View mView;

and in onCreateView()

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  Log.d(TAG, "oncreateView");
  super.onCreateView(inflater, container, savedInstanceState);

  View view = inflater.inflate(R.layout.activity_secure_cloud_drive_folder, container, false);
  this.mView = view;
  return view;
}

and the replace all your getView() with mView

like image 23
spaceMonkey Avatar answered Nov 10 '22 08:11

spaceMonkey


You can fix that by putting your code inside the onViewCreated()-method, which you should override. Don't forget to call super() on it.

like image 27
Joaquin Iurchuk Avatar answered Nov 10 '22 07:11

Joaquin Iurchuk