JavascriptProva

venerdì 23 dicembre 2016

VIew Pager e fragments con adapter

Creo un fragment.
public class Frammento extends Fragment {

    OnFragmentInteractionListener mListener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View v=inflater.inflate(R.layout.frammento,container,false);
        return v;
    }

    @Override
    public void onAttach(Context context){
        super.onAttach(context);
        if(context instanceof com.antonello.frammenti.OnFragmentInteractionListener){
            mListener=(OnFragmentInteractionListener)context;
        }
    }

    public interface OnFragmentInteractionListener{
        public void onFragmentInteraction();
    }

}
Questo è lo scheletro essenziale per creare un fragment.
Ora voglio aggiungervi un Button programmaticamente.
public class Frammento extends Fragment {

    Button button;
    LinearLayout mainLayout;
    OnFragmentInteractionListener mListener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View v=inflater.inflate(R.layout.frammento,container,false);
        button=new Button(v.getContext());
        mainLayout=(LinearLayout)v.findViewById(R.id.mainLayout);
        mainLayout.addView(button);
        return v;
    }

    @Override
    public void onAttach(Context context){
        super.onAttach(context);
        if(context instanceof com.antonello.frammenti.OnFragmentInteractionListener){
            mListener=(OnFragmentInteractionListener)context;
        }
    }

    public interface OnFragmentInteractionListener{
        public void onFragmentInteraction();
    }

}
Ecco, ho aggiunto un button senza alcun listener.
Ora voglio vedere se "funziona".

Devo caricare il fragment nel Layout principale.

Provo con questo codice, se lo ricordo abbastanza bene:
public class MainActivity extends AppCompatActivity implements FragmentBarra.OnFragmentInteractionListener{

    Helper helper;
    Fragment myFrag;
    FragmentManager fragmentManager=getSupportFragmentManager();
    FragmentTransaction transaction;
    


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myFrag=new Frammento();
        transaction=fragmentManager.beginTransaction();
        transaction.add(R.id.barra,myFrag,"myfrag");
        transaction.commit();






    }

    @Override
    public void onFragmentInteraction() {

    }




}
Il button c'è.
Ora dovrei collegare il ViewPager con un adapter.
Nella fattispecie si usa il FragmentPagerAdapter, che devo estendere.
Ci provo...

    public class Adapter extends FragmentPagerAdapter{

        public Adapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return null;
        }

        @Override
        public int getCount() {
            return 0;
        }
    }
Già scrivendo l'estensione della classe Android Studio richiede l'implementazione dei metodi e la creazione del costruttore in automatico, per cui la cosa non presenta molti problemi.
Costruisco direttamente una nuova istanza del Fragment da inserire nell'altro LinearLayout, passandoci il numero di posizione attribuito dall'adapter:
    public class Adapter extends FragmentPagerAdapter{

        public Adapter(FragmentManager fm) {

            super(fm);
        }

        @Override
        public Fragment getItem(int position) {

            frag3=new Frammento3();
            Bundle args=new Bundle();
            args.putInt("num",position);
            frag3.setArguments(args);
            return frag3;
        }

        @Override
        public int getCount() {

            return 2;
        }
    }
Nel codice del fragment ho una variabile int che accoglie nel metodo onCreate il numero attribuito come parametro, ossia position.
public class Frammento3 extends Fragment {

    OnFragmentInteractionListener mListener;

    int numero;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        numero=getArguments().getInt("num");
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View v=inflater.inflate(R.layout.frammento3,container,false);
        TextView textView=(TextView)v.findViewById(R.id.textView2);
        textView.setText(numero+"");
        return v;
    }

    @Override
    public void onAttach(Context context){
        super.onAttach(context);
        if(context instanceof OnFragmentInteractionListener){
            mListener=(OnFragmentInteractionListener)context;
        }
    }
}
Senza fare quella costruzione con newInstance, della quale non ho, sinceramente, capito lo scopo.

Nessun commento:

Posta un commento