2016-06-15 62 views
1

我想为我的FloatingActionButton编写不同的功能,具体取决于mainActivity当前托管的片段。然而由于我的onClick()方法的原因,getSupportFragmentManager().findFragmentById()返回nullfindfragmentbyid在mainActivity中返回null在viewpager下托管3个片段

我还没有看到任何与viewpager实现这个问题的例子,我很好奇,如果有一个不同的方法,我必须采取。

MainActivity 

    import android.content.Intent; 
    import android.os.Bundle; 
    import android.support.design.widget.FloatingActionButton; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentActivity; 
    import android.support.v4.view.ViewPager; 
    import android.util.Log; 
    import android.view.View; 


    public class MainActivity extends FragmentActivity { 

    private Adapter mAdapter; 
    private ViewPager mViewPager; 
    private static FloatingActionButton bButton; 
    private static String UID; 
    private Intent intent; 


    public static String getUID(){ 
     return UID; 
    } 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mAdapter = new Adapter(getSupportFragmentManager()); 
     mViewPager = (ViewPager)findViewById(R.id.vPager); 
     mViewPager.setAdapter(mAdapter); 

     intent = getIntent(); 
     UID = intent.getStringExtra("uid"); 

     bButton = (FloatingActionButton)findViewById(R.id.bButton); 
     bButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragContainer); 

       if(fragment == null){ 

        Log.e("TAG","FRAGMENT IS NULL!!"); 
       } 
       else{ 
        Log.e("TAG","FRAGMENT IS NOT NULL!!"); 

       } 

       } 

      }); 
     } 
    } 


NewsFeedFragment 


    import android.os.Bundle; 
    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.ListFragment; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.AdapterView; 
    import android.widget.ArrayAdapter; 
    import android.widget.ListView; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    import com.firebase.client.Firebase; 
    import com.firebase.client.FirebaseError; 
    import com.mycompany.neighbors.R; 
    import com.mycompany.neighbors.SinglePost; 

    import java.util.ArrayList; 

    /** 
    * Created by joshua on 5/25/2016. 
    */ 
    public class NewsFeedFragment extends ListFragment implements AdapterView.OnItemClickListener{ 

     private ListView lv; 
     private TextView tvUserName; 
     private TextView tvStatus; 
     private ArrayList<SinglePost> posts = new ArrayList<>(); 
     private static final String POSTS_PATH = "MY_PATH"; 
     private Firebase postsRef; 
    // private static final String FRAGMENT_POST = "post"; 


     public void postFragment(){ 
      Log.d("TAG", "Doing something else"); 

      PostFragment postFragment = new PostFragment(); 
      FragmentManager fragmentManager = getFragmentManager(); 
      fragmentManager.beginTransaction() 
        .replace(R.id.fragContainer,postFragment) 
        .addToBackStack(null) 
        .commit(); 
     } 

     @Override 
     public void onViewCreated(View v, Bundle s){ 

      lv = getListView(); 
      lv.setOnItemClickListener(this); 

     } 

     @Override 
     public void onCreate(Bundle savedInstance){ 
      super.onCreate(savedInstance); 

     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){ 

      View v = inflater.inflate(R.layout.fragment_post_feed_item,parent,false);//changed 

      tvUserName = (TextView)v.findViewById(R.id.tvUN); 
      tvStatus = (TextView)v.findViewById(R.id.tvStatus); 

      postsRef = new Firebase(POSTS_PATH); 
      postsRef.addChildEventListener(new com.firebase.client.ChildEventListener() { 
       @Override 
       public void onChildAdded(com.firebase.client.DataSnapshot dataSnapshot, String s) { 

        SinglePost post = dataSnapshot.getValue(SinglePost.class); 
        post.setKey(dataSnapshot.getKey()); 
        posts.add(0, post); 

        if(posts.size() > 0) { 
         PostAdapter adapter = new PostAdapter(posts); 
         setListAdapter(adapter); 
        }else{ 
         Toast toast = Toast.makeText(getActivity(),"No data", Toast.LENGTH_SHORT); 
         toast.show(); 
        } 

       } 

       @Override 
       public void onChildChanged(com.firebase.client.DataSnapshot dataSnapshot, String s) { 

       } 

       @Override 
       public void onChildRemoved(com.firebase.client.DataSnapshot dataSnapshot) { 

       } 

       @Override 
       public void onChildMoved(com.firebase.client.DataSnapshot dataSnapshot, String s) { 

       } 

       @Override 
       public void onCancelled(FirebaseError firebaseError) { 

       } 
      }); 


      return v; 
     } 

     @Override 
     public void onListItemClick(ListView l, View v, int position, long id){ 

      SinglePost p = ((PostAdapter) getListAdapter()).getItem(position); 

     } 

     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

     } 

     private class PostAdapter extends ArrayAdapter<SinglePost>{ 

      public PostAdapter(ArrayList<SinglePost> singlePost){ 
       super(getActivity(),android.R.layout.simple_list_item_1,singlePost); 
      } 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent){ 

       if(convertView == null){ 
        convertView = getActivity().getLayoutInflater().inflate(R.layout.fragment_post_feed_item,null); 

       } 

       SinglePost p = getItem(position); 

       TextView tvUserName = (TextView)convertView.findViewById(R.id.tvUN); 
       tvUserName.setText(p.getUserName()); 

       TextView tvStatus = (TextView)convertView.findViewById(R.id.tvStatus); 
       tvStatus.setText(p.getStatus()); 



       return convertView; 
      } 

     } 
    } 

I have 2 other fragments but i'll post one as an example. Here is my adapter for the viewpager. 

Adapter 

    import android.support.v4.app.Fragment; 

    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.FragmentPagerAdapter; 

    import com.mycompany.neighbors.Fragments.MapFragment; 
    import com.mycompany.neighbors.Fragments.NewsFeedFragment; 
    import com.mycompany.neighbors.Fragments.ProfileFragment; 

    /** 
    * Created by joshua on 5/25/2016. 
    */ 
    public class Adapter extends FragmentPagerAdapter { 


      private String Fragment[] = {"Posts" , "Map" , "Profile"}; 
      public Adapter(FragmentManager fm){ 
       super (fm); 
      } 


      @Override 
      public Fragment getItem(int position) { 
       switch(position){ 
        case 0: 
         return new NewsFeedFragment(); 
        case 1: 
         return new MapFragment(); 
        case 2: 
         return new ProfileFragment(); 

        default: 
         return null; 
       } 

      } 

      @Override 
      public int getCount(){return Fragment.length;} 

      @Override 
      public CharSequence getPageTitle(int position) { 
       return Fragment[position]; 
      } 

     } 
+2

可能的复制[检索从ViewPager片段(HTTP://计算器。 com/questions/8785221/retrieve-a-fragment-from-a-viewpager) – Rohan

回答

0

请检查下面的链接,它对于你的问题很好解释:

http://tamsler.blogspot.in/2011/11/android-viewpager-and-fragments-part-ii.html

或者你可以试试下面的代码片段:

1.Where你在视图中添加片段寻呼机或查看寻呼机适配器:

MyFragment myFragment = MyFragment.newInstance(); 
mPageReferenceMap.put(index, "Some Tag"); 
getSupportFragmentManager().beginTransaction().add(myFragment,"Some Tag").commit(); 

2.要得到标签f或当前可见的页面,你再拨打:

int index = mViewPager.getCurrentItem(); 
String tag = mPageReferenceMap.get(index); 

3.and然后得到碎片页:中

Fragment myFragment = getSupportFragmentManager().findFragmentByTag(tag); 
+1

@ErKaushikKajavadara我设法让它与您共享的博客一起工作!谢谢你的链接! – Jcan1995

+0

不客气...那么你可以接受和upvote答案....高兴地帮助你。 –

相关问题