2015-06-18 7 views
5

ho il seguente file xml:come sostituire Vista Vista Pager completamente con un nuovo frammento in Android

<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 

    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Ho tre frammenti del cercapersone vista. In uno del frammento che sto cercando di lanciare un nuovo frammento utilizzando questo codice:

FragmentTransaction trans = getFragmentManager() 
       .beginTransaction(); 
     trans.replace(R.id.pager, new SubscriptionFragment()); 
     trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     trans.addToBackStack(null); 

     trans.commit(); 

sono in grado di sostituire con successo il frammento esistente del ViewPager, ma non serve il mio scopo, quello che ho il desiderio di fare è di non sostituire il frammento esistente già presente nel viewPager, ma di rimuovere la vista dal cercapersone stesso dalla vista e di lanciare un nuovo frammento in modo che le schede in alto non siano più visibili e ViewPager vada della vista. Funziona quando lancio una nuova attività utilizzando l'intento. ma non sta lavorando per un frammento.

Modificato:

public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, new MainFragment()).commit(); 
    } 


} 

MainFragment:

public class MainFragment extends Fragment { 

    FragmentPagerAdapter adapterViewPager; 
    ViewPager viewPager; 
    String title[] = {"Services", "You", "History"}; 

    // TODO: Rename and change types and number of parameters 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     /* Inflate the layout for this fragment */ 
     View view = inflater.inflate(R.layout.fragment_view_pager, container, false); 




     /*************************************/ 
     //CALLING HISTORY API 

     // loadSubscriptions(); 

     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     ViewPagerAdapter mAdapter = new ViewPagerAdapter(getFragmentManager()); 

     ViewPager mPager = (ViewPager) getView().findViewById(R.id.pager); 
     mPager.setAdapter(mAdapter); 
    } 

    public static class ViewPagerAdapter extends FragmentPagerAdapter { 
     public ViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int num) { 
      if (num == 0) { 
       return new ServicesFragment(); 
      } else { 
       return new HistoryFragment(); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     } 
    } 
} 

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/frame_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

</FrameLayout> 

fragment_view_pager.xml

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 

    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

In servicefragment: Sto openig nuovo frammento utilizzando:

physiotherapyView.setOnClickListener(new View.OnClickListener() { 





@Override 

     public void onClick(View view) { 

      FragmentTransaction trans = getFragmentManager() 
        .beginTransaction(); 
      /* 
      * IMPORTANT: We use the "root frame" defined in 
      * "root_fragment.xml" as the reference to replace fragment 
      */ 
      trans.replace(R.id.pager, new SubscriptionFragment()); 

      /* 
      * IMPORTANT: The following lines allow us to add the fragment 
      * to the stack and return to it later, by pressing back 
      */ 
      trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
      trans.addToBackStack(null); 

      trans.commit(); 

     } 

    }); 
+0

è il ViewPager all'interno Frammento troppo? –

+0

@ ItzikSamara non è al suo interno un'attività! – user3458008

risposta

0

non aggiungere, ViewPager Dentro FrameLayout.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/frame_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

</FrameLayout> 

Aggiungere Frammento in questo layout, che contiene ViewPager e aggiungere FragmentTransaction nel vostro mainActivity

public class MainActivity extends FragmentActivity { 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, new MainFragment()).commit(); 

Qui, MainFragment contiene ViewPager, Ora è possibile sostituire il viewPager dalla intero layout con FragmentTransaction

+0

Ho aggiornato la mia domanda di conseguenza – user3458008

+0

ti ho già preso, per favore controlla se la risposta è adatta o no – Abhishek

+0

Non ho ottenuto quello che stai cercando di dire. Intendi dire che ho bisogno di creare una nuova classe ed estendere FragmentActivity. E metti il ​​viewPager all'interno di un frammento invece di un'attività? – user3458008

1

Di seguito è riportato il codice completo per aggiungere o rimuovere frammenti su o da un cercapersone View. Poiché questa è solo una dimostrazione, ho usato solo una vista testuale e ogni frammento aggiunto avrà un colore casuale. Cliccando su un pulsante puoi aggiungere tutti i frammenti che vuoi. Cliccando sulla pagina puoi semplicemente rimuoverlo dal View Pager È possibile spostarsi da una pagina all'altra in un View Pager scorrendo verso destra o verso sinistra.

MainActivity.java

import android.graphics.Color; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.View; 
import android.widget.Button; 
import java.util.ArrayList; 
import java.util.Random; 

public class MainActivity extends FragmentActivity { 

    private MyPagerAdapter mpg; 
    private ArrayList<MyFragment> fragmentlist = new ArrayList<>(); 
    public FragmentManager fmr = getSupportFragmentManager(); 

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

     final ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
     mpg = new MyPagerAdapter(fmr,fragmentlist); 
     pager.setAdapter(mpg); 

     for (int q = 0; q < 5; q++) { 
      int r = new Random().nextInt(100) + 155; 
      int g = new Random().nextInt(100) + 155; 
      int b = new Random().nextInt(100) + 155; 
      fragmentlist.add(MyFragment.newInstance(q, "Page number: " + (q + 1), Color.rgb(r, g, b))); 
      mpg.notifyDataSetChanged(); 
     } 

     Button B1 = (Button) findViewById(R.id.button); 
     B1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       int r = new Random().nextInt(100) + 155; 
       int g = new Random().nextInt(100) + 155; 
       int b = new Random().nextInt(100) + 155; 
       int count = mpg.getCount(); 
       fragmentlist.add(MyFragment.newInstance(count, "Page number: " + (count+1), Color.rgb(r, g, b))); 
       mpg.notifyDataSetChanged(); 

      } 
     }); 
    } 

    public void delete(int pos) { 

     int i = 0; 
     while (i <= fragmentlist.size()) { 
      if (pos == fragmentlist.get(i).getPosition()) break; 
      i++; 

     } 

     fragmentlist.remove(i); 
     mpg.notifyDataSetChanged(); 
    } 

    public class MyPagerAdapter extends FragmentStatePagerAdapter { 

     private ArrayList<MyFragment> fragmentList; 
     public MyPagerAdapter(FragmentManager fm, ArrayList<MyFragment> f) { 
      super(fm); 
      this.fragmentList = f; 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      return fragmentlist.get(pos); 
     } 

     @Override 
     public int getCount() { 
      return fragmentlist.size(); 
     } 

     @Override 
     public int getItemPosition(Object object) { 
      return POSITION_NONE; 
     } 
    } 
} 

MyFragment.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.FrameLayout; 
import android.widget.TextView; 

import java.util.List; 

public class MyFragment extends Fragment { 

    int pos; 

    @Override 
    public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.f_1, container, false); 
     pos = getArguments().getInt("num"); 
     v.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Log.v("MainActivity", "Deleting at pos - " + pos); 
       MainActivity activity = (MainActivity) getActivity(); 
       activity.delete(pos); 
      } 
     }); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragFirst); 
     FrameLayout fl = (FrameLayout) v.findViewById(R.id.frame_layout); 
     tv.setText(getArguments().getString("msg")); 
     fl.setBackgroundColor(getArguments().getInt("colour")); 
     return v; 
    } 

    public int getPosition() { 
     return pos; 
    } 

    public static MyFragment newInstance(int num,String text,int clr) { 

     MyFragment f = new MyFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 
     b.putInt("colour", clr); 
     b.putInt("num",num); 
     f.setArguments(b); 
     return f; 
    } 
} 

E i xml.files,

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.shakthivels.assingment10.MainActivity" 
    android:id="@+id/r_v" 
    > 

    <android.support.v4.view.ViewPager 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/viewPager" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="ADD a fragment" 
     android:id="@+id/button" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" /> 

</RelativeLayout> 

f_1.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/av" 
    > 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/frame_layout"> 

     <TextView 
      android:id="@+id/tvFragFirst" 
      android:layout_width="203dp" 
      android:layout_height="127dp" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:textSize="26sp" 
      android:text="TextView" 
      android:layout_gravity="center" 
      android:textColor="#000000" /> 

    </FrameLayout> 
</RelativeLayout> 

Already Existing Fragment1 Newly added Fragment to the view Pager2

Problemi correlati