2016-04-08 11 views
0

In meiner Anwendung verwende ich pageviewer mit zwei Registerkarten. In jedem Tab bevölke ich die Ansicht mit einigen Daten nach dem Aufruf von aysnctask. Auch das Fragment, das diese Tabs und Viewpager enthält, enthält Filter, die den Inhalt meiner Ansicht entsprechend filtern. Außerdem benutze ich Recycleview für das Auffüllen von Daten. Beim Klick auf recycleview öffne ich ein neues Fragment. Das Problem, dem ich gegenüberstehe, ist, dass, wenn App zum ersten Mal geöffnet ist, nach Daten, wenn ich mein Fragment bei Klickereignissen mit getsupportFragmentmanager öffne, es gut funktioniert. Aber wenn ich meinen Dateninhalt mit Filter ändere, klicke ich auf Element, um Fragment mit GetsupportFragmentmanager zu öffnen Es gibt mir einen Fehler.NullpointerException mit getSupportfrgamnetmanager

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentManager android.support.v4.app.FragmentActivity.getSupportFragmentManager()' on a null object reference 

ParentFragment Code ist hier:

public class TabB extends Fragment { 
ViewPager viewPager; 
TabLayout tabLayout; 
Clubs clubs = new Clubs(); 
Events events = new Events(); 
private static RecyclerView Genre; 
private RecyclerView.LayoutManager mLayoutManager; 
public static JSONArray jsonArrayResult = new JSONArray(); 
public static final String[] IMAGE_NAME = {"allevent", "rock", "jazz", "house", "bass", "chill","bollywood","commerial", "karaoke","sufi"}; 
ArrayList<Integer> arrayList = new ArrayList<>(); 
public static String Genrename = IMAGE_NAME[0]; 
public static GenreAdapter genreAdapter; 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View RootView = inflater.inflate(R.layout.tabb, container, false); 
    viewPager = (ViewPager) RootView.findViewById(R.id.viewpager); 
    tabLayout = (TabLayout) RootView.findViewById(R.id.tabs); 
    Genre = (RecyclerView)RootView.findViewById(R.id.rvImages); 
    for (int i=0;i< IMAGE_NAME.length;i++){ 
     String imageFileName = IMAGE_NAME[i]; 
     int imgResId = getResources().getIdentifier(imageFileName, "drawable", "in.catalystapp.catalyst"); 
     arrayList.add(imgResId); 
    } 
    mLayoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL, false); 
    Genre.setLayoutManager(mLayoutManager); 
    genreAdapter = new GenreAdapter(arrayList, getActivity()); 
    Genre.setAdapter(genreAdapter); 
    TabBviewPagerAdapter tabBviewPagerAdapter = new TabBviewPagerAdapter(getChildFragmentManager(),"allevent"); 
    viewPager.setAdapter(tabBviewPagerAdapter); 
    tabLayout.setupWithViewPager(viewPager); 
    genreAdapter.SetOnItemClickListener(new GenreAdapter.OnItemClickListener() { 
     @Override 
     public void OnItemClick(View view, int position) { 
      FilterGenres(IMAGE_NAME[position], new PageviewCaller() { 
       @Override 
       public void PopulatePageViewer(String key) { 
        Log.d("key", key); 
        clubs.PopulateClubList(key); 
        events.FilterEvents(key); 
       } 
      }); 
     } 
    }); 
    return RootView; 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 

    try { 
     Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); 
     childFragmentManager.setAccessible(true); 
     childFragmentManager.set(this, null); 

    } catch (NoSuchFieldException e) { 
     throw new RuntimeException(e); 
    } catch (IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } 
} 

public void FilterGenres(String key,PageviewCaller pageviewCaller){ 
    pageviewCaller.PopulatePageViewer(key); 
} 

eines frgament Code Kind ist hier:

public class Clubs extends Fragment { 
static ArrayList<ClubItem> mClubItems = new ArrayList<>(); 
static RecyclerView Clubcards; 
static RecyclerView.LayoutManager layoutManager; 
static ClubsAdapter clubsAdapter; 
static Context context; 
public String mKey; 
Parcelable liststate; 
static JSONArray jsonClubs = new JSONArray(); 

public Clubs(){} 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View RootView = inflater.inflate(R.layout.clubs, container, false); 
    Log.d("clubs-life-cycle","oncreate"); 
    Clubcards = (RecyclerView)RootView.findViewById(R.id.clubcard); 
    context = getActivity(); 
    Bundle args = getArguments(); 
    mKey = args.getString("key"); 
    new GetClubDetails().execute(); 
    return RootView; 
} 

@Override 
public void onPause() { 
    Log.d("liststate", "saving listview state @ onPause"); 
    liststate = layoutManager.onSaveInstanceState(); 
    super.onPause(); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    if (liststate != null){ 
     layoutManager.onRestoreInstanceState(liststate); 
    } else { 

    } 
} 

public class GetClubDetails extends AsyncTask<String,Void,Void> { 
    JSONObject jsonresult = new JSONObject(); 
    ProgressDialog progressDialog = new ProgressDialog(getActivity()); 
    @Override 
    protected void onPreExecute(){ 
     super.onPreExecute(); 
     progressDialog.setMessage("Fetching Feeds...."); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(String... params) { 
     RESTfulAPI resTfulAPI = new RESTfulAPI(); 
     jsonresult = resTfulAPI.getJSONfromurl("api/clubs/","GET",""); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     progressDialog.dismiss(); 
     super.onPostExecute(aVoid); 
     if (jsonresult!=null){ 
      Log.d("json", jsonresult.toString()); 
      try { 
       jsonClubs = jsonresult.getJSONArray("datasets"); 
       PopulateClubList("allevent"); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } else { 
     } 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 

    try { 
     Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); 
     childFragmentManager.setAccessible(true); 
     childFragmentManager.set(this, null); 

    } catch (NoSuchFieldException e) { 
     throw new RuntimeException(e); 
    } catch (IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } 
} 

public void PopulateClubList(String key){ 
    mClubItems = new ArrayList<>(); 
    clubsAdapter = null; 
    for (int i=0;i < jsonClubs.length();i++){ 
     try { 
      if (key.equals("allevent") || key.equals(jsonClubs.getJSONObject(i).getString("genre"))){ 
       mClubItems.add(new ClubItem(jsonClubs.getJSONObject(i).getString("clubName"),jsonClubs.getJSONObject(i).getString("address"))); 
       clubsAdapter = new ClubsAdapter(mClubItems,context); 
       layoutManager = new LinearLayoutManager(context); 
       Clubcards.setLayoutManager(layoutManager); 
       Clubcards.setAdapter(clubsAdapter); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
    clubsAdapter.SetOnItemClickListener(new ClubsAdapter.OnItemClickListener() { 
     @Override 
     public void OnItemClick(View view, int position) { 
      getActivity().getSupportFragmentManager().beginTransaction().setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out).add(R.id.main_content, new Clubdetails()).addToBackStack(null).commit(); 
     } 
    }); 
} 

Was mache ich falsch?

+0

Ihre Importe Überprüfen Sie, sind Sie sicher, dass Sie in jedem Fragment, das die Unterstützung Fragment importieren? – bdavies6086

+0

Scheint so, als ob Ihr Fragment losgelöst ist und Aktivität null ist –

+0

Bitte poststacktrace. –

Antwort

0

Dies kann dazu führen, dass Sie verschiedene Version von Fragment importieren.

Da gibt es zwei Arten von .

android.support.v4.app.Fragment

und

android.app.Fragment;

Stellen Sie sicher, dass Sie dieselbe Fragment in jede Fragmnet-Klasse oder Aktivitäten importieren.

0

Können Sie versuchen, getFragmentManager() anstelle von getSupportFragmentManager() zu verwenden?

Vielleicht ist es wegen Ihrer Version von AppCompat Bibliothek