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.

mercoledì 21 dicembre 2016

Codice per il viewPager.

Mi salvo un codice e torno ad esercitarmi su di esso...
public class MainActivity extends AppCompatActivity implements FragmentBarra.OnFragmentInteractionListener{

    Helper helper;
    Frammento myFrag;
    FragmentBarra fragmentBarra;
    PagerAdapter adapter;
    ViewPager viewPager;
    ArrayList lista;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lista=new ArrayList();
        lista.add("Gongolo");
        lista.add("Mammolo");
        lista.add("Eolo");
        lista.add("Pisolo");
        lista.add("Brontolo");
        lista.add("Dotto");
        lista.add("Cucciolo");
        helper=new Helper(this);

        viewPager=(ViewPager)findViewById(R.id.vpdisplay);
        adapter=new ScreenSlidePagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);

        fragmentBarra = new FragmentBarra();
        FragmentManager fragmentManager=getSupportFragmentManager();
        FragmentTransaction transaction=fragmentManager.beginTransaction();
        transaction.add(R.id.barra,fragmentBarra);

        /*helper.save("Pinco");
        helper.save("Lappo");
        helper.save("Bobbo");*/





    }

    @Override
    public void onFragmentInteraction() {
        myFrag.getView().setBackgroundColor(Color.GREEN);
    }

    public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{

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

        @Override
        public Fragment getItem(int position) {

            return MioFrammento.newInstance(position,lista);
        }

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

    public static class MioFrammento extends Fragment{
        int numero;
        Serializable lista;
        public static MioFrammento newInstance(int num, ArrayList lista){
            MioFrammento f=new MioFrammento();
           0
            Bundle args=new Bundle();
            args.putInt("num",num);
            args.putSerializable("lista",lista);
            f.setArguments(args);
            return f;
        }

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

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
            View v=inflater.inflate(R.layout.mio_frammento,container,false);
            TextView textView=(TextView)v.findViewById(R.id.textView);
            textView.setText(((ArrayList)lista).get(numero));
            return v;
        }
    }


}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="#AAFFFF"
    android:orientation="horizontal"
    android:id="@+id/container"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <LinearLayout
        android:id="@+id/barra"
        android:orientation="horizontal"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/vpdisplay"
        android:layout_height="match_parent"
        android:layout_width="0dp"
        android:layout_weight="4">

    </android.support.v4.view.ViewPager>

</LinearLayout> 

lunedì 19 dicembre 2016

ViewPager e relativo codice

Con il ViewPager bisogna sempre creare l'adapter.
Sembra che PagerAdapter sia un antenato di ScreenSlidePagerAdapter.

Il codice è infatti qualcosa del tipo
PagerAdapter pagerAdapter=new ScreenSlidePagerAdapter(getSupportFragmentManager())
Ossia il costruttore di ScreenSlidePagerAdapter ha bisogno di un parametro di tipo FragmentManager o derivato.
Una volta istanziato il PagerAdapter, e istanziato il ViewPager, si azzecca l'adapter al ViewPager, ma come si aggiungono pagine al PagerAdapter?

In realtà ho commesso un errore: ScreenSlidePagerAdapter è una classe creata ex novo, che estende FragmentStatePagerAdapter.
Vediamo il codice per la creazione di ScreenSlidePagerAdapter che estende FragmentStatePagerAdapter...
Ecco, ha due proprietà: una accetta come parametro un int posizione e restituisce un Fragment, l'altra imposta il numero di elementi.
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch(position){
                case 0:
                    return new Frammento();

                case 1:
                    return new Frammento2();

                case 2:
                    return new Frammento3();

                default:break;

            }
            return null;
        }

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

Lettura di un database tramite i fragments

Per il momento creo un database o verifico se un database sia già stato creato.
Un database c'è, ed è presente su storage anziché sulla cartella inaccessibile. Credo che questa sia una soluzione più conveniente, anche se espone il database a un maggior rischio, per la possibilità di trasferirlo facilmente mediante un semplice meccanismo di copia-incolla anche su dispositivi non rootati.

Ripristino il codice per aggiungere voci al database.
public class MainActivity extends AppCompatActivity implements Frammento.OnFragmentInteractionListener{

    Helper helper;

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

        helper=new Helper(this);
        
        helper.save("Mario");
        helper.save("Pippo");
        helper.save("Mimmo");

,,,,,
Ora mi occupo di caricare un fragment.
Per prima cosa ho creato il codice del fragment, con tanto di creazione dell'interfaccia per inviare messaggi all'activity:
public class Frammento3 extends Fragment {

    OnFragmentInteractionListener mListener;

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

    @Override
    public void onAttach(Context context){
        super.onAttach(context);
        if(context instanceof OnFragmentInteractionListener){
            mListener=(OnFragmentInteractionListener)context;
        }
    }
}
Quindi ho creato il codice dell'activity principale:
public class MainActivity extends AppCompatActivity implements Frammento.OnFragmentInteractionListener{

    Helper helper;
    Frammento myFrag;
    FragmentManager fragmentManager=getSupportFragmentManager();
    FragmentTransaction transaction=fragmentManager.beginTransaction();

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

        helper=new Helper(this);

        /*helper.save("Mario");
        helper.save("Pippo");
        helper.save("Mimmo");*/

        myFrag=new Frammento();
        transaction.add(R.id.display,myFrag,"frammento");
        transaction.commit();



    }

    @Override
    public void onFragmentInteraction() {

    }
}
(ho oscurato i comandi che avevo usato in precedenza per la scrittura del database).

Ottengo il caricamento del frammento.

Ora devo fare in modo che il fragment legga il database disponendo i dati che vi trova in qualche view...

Fatto.
Viene creata una TextView per ogni record appartenente al recordset.
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View v=(View)inflater.inflate(R.layout.frammento,container,false);
        LinearLayout layout=(LinearLayout)v.findViewById(R.id.frammento);
        helper=new Helper(v.getContext());
        Cursor c=helper.query();
        do{
            testo=new TextView(v.getContext());
            testo.setText(c.getString(c.getColumnIndex("nome")));
            layout.addView(testo);
        }while(c.moveToNext());
        return v;
    }
E funziona.

sabato 17 dicembre 2016

Tornando a Giobe...

Ricominciamo dalla firma di Zbikovsky...
C:\Arch-Lab\LAVORO~1>debug es1.xxx
-d
17BC:0100  4D 5A 16 01 02 00 00 00-20 00 00 00 FF FF 00 00   MZ...... .......
17BC:0110  00 00 00 00 00 01 00 00-1E 00 00 00 01 00 00 00   ................
17BC:0120  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:0130  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:0140  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:0150  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:0160  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:0170  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
Andando indietro vado al PSP:
-d 17bc:0000
17BC:0000  CD 20 FF 9F 00 9A EE FE-1D F0 4F 03 20 12 8A 03   . ........O. ...
17BC:0010  20 12 17 03 20 12 2C 07-01 01 01 00 02 FF FF FF    ... .,.........
17BC:0020  FF FF FF FF FF FF FF FF-FF FF FF FF A0 11 4E 01   ..............N.
17BC:0030  E0 16 14 00 18 00 BC 17-FF FF FF FF 00 00 00 00   ................
17BC:0040  05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:0050  CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20   .!...........
17BC:0060  20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20           .....
17BC:0070  20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00           ........
-d
17BC:0080  00 0D 65 73 31 2E 78 78-78 0D 65 78 65 0D 20 49   ..es1.xxx.exe. I
17BC:0090  35 20 44 31 20 50 33 33-30 20 54 33 0D 74 2E 65   5 D1 P330 T3.t.e
17BC:00A0  78 65 0D 00 00 00 00 00-00 00 00 00 00 00 00 00   xe..............
17BC:00B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:00C0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:00D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:00E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17BC:00F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
-

mercoledì 14 dicembre 2016

Gestione dei frammenti su un'activity, con codice per l'espansione di un fragment.

Non ho lasciato nessun promemoria scritto di come caricare più fragments in un'activity scambiandone uno su comando dell'altro.
Ecco:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="#AAFFFF"
    android:orientation="horizontal"
    android:id="@+id/container"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <LinearLayout
        android:id="@+id/barra"
        android:orientation="horizontal"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"/>

    <LinearLayout
        android:id="@+id/display"
        android:orientation="horizontal"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"/>


</LinearLayout> 
public class MainActivity extends AppCompatActivity implements Frammento.OnFragmentInteractionListener{

    Frammento myFrag;
    FragmentManager fragmentManager;
    FragmentTransaction transaction;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myFrag=new Frammento();
        fragmentManager=getSupportFragmentManager();
        transaction=fragmentManager.beginTransaction();
        transaction.add(R.id.barra,myFrag,"barra");
        transaction.commit();

        Frammento2 frag2=new Frammento2();
        transaction=fragmentManager.beginTransaction();
        transaction.add(R.id.display,frag2,"display");
        transaction.commit();

    }

    public void onFragmentInteraction(){
        Frammento2 frammento2=(Frammento2)fragmentManager.findFragmentByTag("display");
        Button bottone=new Button(getApplicationContext());
        LinearLayout mainLayout=(LinearLayout)frammento2.getView().findViewById(R.id.frammento2);
        mainLayout.addView(bottone);
    }

}




Fragments:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:background="#FFFFFF"
    android:id="@+id/frammento">


    <Button
        android:text="Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button2" />
</ScrollView> 
public class Frammento extends Fragment {

    OnFragmentInteractionListener mListener;
    Button button;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(
                R.layout.frammento, container, false);
        button=(Button)rootView.findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                mListener.onFragmentInteraction();
            }
        });
        return rootView;
    }

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

    public interface OnFragmentInteractionListener{
        public void onFragmentInteraction();
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="4"
    android:id="@+id/frammento2"
    android:background="#FAA">

    <TextView
        android:text="SECONDO FRAMMENTO"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />
</LinearLayout> 
public class Frammento2 extends Fragment {

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

    @Override
    public void onAttach(Context context){
        super.onAttach(context);
        if(context instanceof OnFragmentInteractionListener){
            mListener=(OnFragmentInteractionListener)context;
        }
        System.out.println("FRAMMENTO 2 ONATTACH");

    }


}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:background="#AFA"
    android:layout_weight="4">



    <TextView
        android:text="TERZO FRAMMENTO"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView2" />

    <Button
        android:text="Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button4" />
</LinearLayout> 
public class Frammento3 extends Fragment {

    OnFragmentInteractionListener mListener;

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

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

Spinner (ripasso)

Ho ripassato la creazione di uno Spinner. Ed ecco il codice:
        <Spinner
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:id="@+id/spinner"
            android:background="#FFFFFF"
            android:layout_weight="1" />
public class MainActivity extends AppCompatActivity {

    ArrayAdapter adapter;
    Spinner spinner;
    List esami;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        esami=new ArrayList();
        esami.add("RBC");
        esami.add("Hb");
        esami.add("MCV");
        adapter=new ArrayAdapter(this,android.R.layout.simple_spinner_dropdown_item,esami);
        spinner=(Spinner)findViewById(R.id.spinner);
        spinner.setAdapter(adapter);


    }

}