2016-07-21 32 views
4

In meinem Kind Fragment habe ich einen Recyclerview, und ich hatte ein Appbar-Layout in meinem Elternteil Fragment. Wenn das erste Element des Recyclerview sichtbar ist, muss ich die appbar Layout in meinem Elternfragment aktualisierenKind Fragment zu Parent Fragment Kommunikation

Meine Schnittstelle

public interface OnListFirstItemVisibleListener { 
    public void sendDataToFragmentOnFirstItemVisible(boolean data, int dy); 
} 

in Kinder Fragment Klasse

public class MyChildFragment extends Fragment{ 
private OnListFirstItemVisibleListener mListFirstItemVisibleListener; 
............. 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     mListFirstItemVisibleListener=(OnListFirstItemVisibleListener) new ParentFragment(); 

     return view; 
    } 
@Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 

     if(mLinearLayoutManager.findFirstCompletelyVisibleItemPosition()==0&&mListFirstItemVisibleListener != null){ 
      mListFirstItemVisibleListener.sendDataToFragmentOnFirstItemVisible(true,dy); 
     }else{ 
      mListFirstItemVisibleListener.sendDataToFragmentOnFirstItemVisible(false,dy); 

     } 

    } 

In Elternfragment Klasse

Ich implementierte die Schnittstelle

public class MyParentFragment extends Fragment implements OnListFirstItemVisibleListener{ 

............ 

@Override 
    public void sendDataToFragmentOnFirstItemVisible(boolean data, int dy) { 
     if (dy < 0&&data==true) 
      mAppBarLayout.setExpanded(true); 
    } 

} 

Aber ich bekomme AppBar Layout als null

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.AppBarLayout.setExpanded(boolean)' on a null object 

Wohin gehe ich falsch?

+1

Vergewissern Sie sich zuerst, dass Ihre beiden Eltern und Kindfragmente sind in Aktivität aufgebläht. Ich denke, dass das Elternfragment in Ihrer Aktivität noch nicht aufgebläht ist und Sie versuchen, eine Methode aufzurufen. –

+0

@prathamkesarkar Wie sicher? Ich rief es onAttach, immer noch nicht funktioniert – MrRobot9

+0

onAttach hilft nicht dabei sicherzustellen, dass Ihre Ansichten aufgeblasen sind oder nicht –

Antwort

6

Sie müssen den ChildFragmentManager verwenden. Sie Elternteil sollte wie folgt aussehen:

public class ParentFragment extends Fragment { 

    private TextView mActionBar; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_parent, container, false); 
     mActionBar = (TextView) view.findViewById(R.id.actionBar); 
     return view; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     getChildFragmentManager().beginTransaction().add(R.id.childHolder, new ChildFragment()).commit(); 
    } 

    public void setActionBarHidden(boolean isHidden) { 
     mActionBar.setVisibility(isHidden ? GONE : VISIBLE); 
    } 

} 

Und Ihr Kind wie folgt aus:

public class ChildFragment extends Fragment { 

    public ChildFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_child, container, false); 
     mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
     mLinearLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(mLinearLayoutManager); 
     mRecyclerView.setAdapter(new MyAdapter(mDataSet)); 

     return view; 
    } 

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

     mParentFragment = (ParentFragment) getParentFragment(); 
     mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       if (mLinearLayoutManager.findFirstCompletelyVisibleItemPosition() == 0 && mParentFragment != null) { 
        mParentFragment.setActionBarHidden(true); 
       } else { 
        mParentFragment.setActionBarHidden(false); 
       } 
      } 
     }); 
    } 
} 
1
ParentFragment parentFrag = ((ParentFragment)ChildFragment.this.getParentFragment()); 
parentFrag.YourParentFragmentMethod(); 

dies für mich gearbeitet wird ...

Verwandte Themen