Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fragment not attached to a context

In activity in Toolbar I got a button which need to call method from fragment and update list in that fragment. Now it is an error. Calling in activity

@Override public boolean onOptionsItemSelected(MenuItem item) {     switch (item.getItemId()){         case  R.id.menu_sort:             ListFragment listFragment = new ListFragment();             listFragment.sortByPopularity();             break;     }     return super.onOptionsItemSelected(item); } 

Fragment code. I have found an error when Activity not attached. But nothing with context

public class ListFragment extends Fragment implements ListAdapter.ItemClickListener {      /**      * Needed      */     RecyclerView recyclerView;     View view;     List<BasePojo.Result> list;     ListAdapter listAdapter;      public ListFragment() {     }      @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,                              Bundle savedInstanceState) {          /**          * Main Initialization          */         view = inflater.inflate(R.layout.fragment_list, container, false);         recyclerView = view.findViewById(R.id.recycler_list_detailed);         recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));         list = new ArrayList<>();         listAdapter = new ListAdapter(list, setOnItemClickCallback());         recyclerView.setAdapter(listAdapter);          RetrofitClient.getApiService().getPhotosList(getString(R.string.api_key)).enqueue(new Callback<BasePojo>() {             @Override             public void onResponse(Call<BasePojo> call, Response<BasePojo> response) {                 BasePojo basePojo = response.body();                 list.addAll(basePojo.getResults());                 recyclerView.getAdapter().notifyDataSetChanged();             }              @Override             public void onFailure(Call<BasePojo> call, Throwable t) {                 Log.d("tag", "Response failed" + t.toString());              }         });           return view;     }      @Override     public void onItemClick(View view, int position) {         Log.v("in on click", "value " + position);      }      private OnItemClickListener.OnItemClickCallback setOnItemClickCallback() {         OnItemClickListener.OnItemClickCallback onItemClickCallback = new OnItemClickListener.OnItemClickCallback() {             @Override             public void onItemClicked(View view, int position) {                 BasePojo.Result itemClicked = list.get(position);                 Bundle bundle = new Bundle();                 bundle.putString("title", itemClicked.getOriginalTitle());                 bundle.putString("overview", itemClicked.getOverview());                 bundle.putString("release_date", itemClicked.getReleaseDate());                 bundle.putString("vote_average", itemClicked.getVoteAverage().toString());                 bundle.putString("poster_path", itemClicked.getPosterPath());                 DetailedFragment detailedFragment = new DetailedFragment();                 detailedFragment.setArguments(bundle);                 FragmentManager manager = getActivity().getSupportFragmentManager();                 FragmentTransaction transaction = manager.beginTransaction();                 transaction.replace(R.id.main_frame_list, detailedFragment);                 Log.d("tag", "title is 111 " + bundle.get("title"));                  transaction.commit();             }          };         return onItemClickCallback;     }      @Override     public void onAttachFragment(Fragment childFragment) {         super.onAttachFragment(childFragment);      }      public void sortByPopularity() {         RetrofitClient.getApiService().getPopularList(getString(R.string.api_key)).enqueue(new Callback<BasePojo>() {             @Override             public void onResponse(Call<BasePojo> call, Response<BasePojo> response) {                 BasePojo basePojo = response.body();                 list.addAll(basePojo.getResults());                 recyclerView.getAdapter().notifyDataSetChanged();             }              @Override             public void onFailure(Call<BasePojo> call, Throwable t) {                 Log.d("tag", "Response failed" + t.toString());              }         }); }  } 

And here is an error

05-09 12:48:26.915 5775-5775/com.borisruzanov.popularmovies E/AndroidRuntime: FATAL EXCEPTION: main Process: com.borisruzanov.popularmovies, PID: 5775 java.lang.IllegalStateException: Fragment ListFragment{6dbd6de} not attached to a context.     at android.support.v4.app.Fragment.requireContext(Fragment.java:614)     at android.support.v4.app.Fragment.getResources(Fragment.java:678)     at android.support.v4.app.Fragment.getString(Fragment.java:700)     at com.borisruzanov.popularmovies.ListFragment.sortByPopularity(ListFragment.java:110)     at com.borisruzanov.popularmovies.MainActivity.onOptionsItemSelected(MainActivity.java:47)     at android.app.Activity.onMenuItemSelected(Activity.java:3204)     at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:407)     at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)     at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108)     at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108)     at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:63)     at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:203)     at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:780)     at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)     at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)     at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)     at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:963)     at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:624)     at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:150)     at android.view.View.performClick(View.java:5610)     at android.view.View$PerformClick.run(View.java:22265)     at android.os.Handler.handleCallback(Handler.java:751)     at android.os.Handler.dispatchMessage(Handler.java:95)     at android.os.Looper.loop(Looper.java:154)     at android.app.ActivityThread.main(ActivityThread.java:6077)     at java.lang.reflect.Method.invoke(Native Method)     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

Thank you very much for your time and help. If my question looks not well please make a note and I will teach how to ask questions better

like image 889
Boris Ruzanov Avatar asked May 09 '18 15:05

Boris Ruzanov


People also ask

How do I attach a fragment to an activity?

Add a fragment to an activity You can add your fragment to the activity's view hierarchy either by defining the fragment in your activity's layout file or by defining a fragment container in your activity's layout file and then programmatically adding the fragment from within your activity.

Does fragment have context?

The fragment has different notifications, one of them being onActivityCreated. You can get the instance of the activity in this lifecycle event of the fragment. Then: you can dereference the fragment to get activity, context or applicationcontext as you desire: this.

What is onAttach in fragment?

onAttach(Activity) called once the fragment is associated with its activity. onCreate(Bundle) called to do initial creation of the fragment. onCreateView(LayoutInflater, ViewGroup, Bundle) creates and returns the view hierarchy associated with the fragment.


Video Answer


1 Answers

In my case, this problem occurred when I was calling getString()

changing this calls to getActivity().getString() solved the problem.

like image 70
FractalBob Avatar answered Sep 20 '22 12:09

FractalBob