Autore Topic: ViewPager e fragments  (Letto 999 volte)

Offline ale88sv

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +1
    • Google+
    • Mostra profilo
    • Le Mie Apps
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ale88sv
  • Sistema operativo:
    Windows 7 / Ubuntu 12.4
ViewPager e fragments
« il: 03 Ottobre 2012, 11:58:12 CEST »
0
Ciao a tutti,
sto cercando di fare un app  con 3 facciate "slidabili" | btn | checkbox | edittext
ho letto il tutorial di bradipao, per i fragments, mentre per le schermate slidabili ho usato "crea progetto swype" di default di Jelly Bean.

Sono riuscito ( non è che ho fatto molto  :-P) a creare l'interfaccia, ora vorrei che alla pressione del bottone compaia un Toast con il contenuto della edittext.
Vi posto un po' di codice:

insertActivity.java
Codice (Java): [Seleziona]
package alessandro.vegna.barcode;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.content.Context;
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.FragmentPagerAdapter;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;


public class InsertActivity extends FragmentActivity {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide fragments for each of the
     * sections. We use a {@link android.support.v4.app.FragmentPagerAdapter} derivative, which will
     * keep every loaded fragment in memory. If this becomes too memory intensive, it may be best
     * to switch to a {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */

    SectionsPagerAdapter mSectionsPagerAdapter;
    public EditText _et;

    /**
     * The {@link ViewPager} that will host the section contents.
     */

    ViewPager mViewPager;

    @SuppressLint("NewApi")
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.insert);
        getActionBar().setDisplayHomeAsUpEnabled(true);
        // Create the adapter that will return a fragment for each of the three primary sections
        // of the app.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());


        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.insert, menu);
        return true;
    }

   
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void test(View v) {
        Log.v("NULL","NUM:"+mSectionsPagerAdapter.getCount());
        if(mSectionsPagerAdapter == null)
                Log.v("NULL", "mSection");
        if(mSectionsPagerAdapter.getItem(2) == null)
                Log.v("NULL", "getItem");
        if(mSectionsPagerAdapter.getItem(2).getView() == null)
                Log.v("NULL", "getView");
        _et = (EditText) mSectionsPagerAdapter.getItem(2).getView().findViewById(R.id.editText1);
        Toast.makeText(this, _et.getText().toString(),Toast.LENGTH_LONG).show();
        }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to one of the primary
     * sections of the app.
     */

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int i) {
                Log.v("NULL","item:"+i);
            switch (i) {
                        case 0:
                                return new Page1();
                        case 1:
                                return new Page2();
                        case 2:
                                return new Page3();
                        default:
                                return null;
                        }
           
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0: return getString(R.string.title_section1).toUpperCase();
                case 1: return getString(R.string.title_section2).toUpperCase();
                case 2: return getString(R.string.title_section3).toUpperCase();
            }
            return null;
        }
    }


    public static class Page1 extends Fragment {
        public Page1() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
       
                View v = inflater.inflate(R.layout.insert_fragment_1, null);
               
                Button btn = (Button) v.findViewById(R.id.button1);
                btn.setOnClickListener(new OnClickListener() {
                               
                                public void onClick(View v) {
                                       
                                        /*TROVARE IL MODO DI LEGGERE COSA C'è NELLA EDITTEXT IN PAGE3*/

                                        Toast.makeText(getActivity(), "testo eT:", Toast.LENGTH_LONG).show();
                                       
                                }
                });
                               
                       
                        return v;
               
        }
       
    }
   
    public static class Page2 extends Fragment {
        public Page2() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
       
                View v = inflater.inflate(R.layout.insert_fragment_2, null);

                        return v;
               
        }
       
    }
   
    public static class Page3 extends Fragment {
       
        private EditText _et;
       
        public Page3() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
       
                View v = inflater.inflate(R.layout.insert_fragment_3, null);
               
                _et = (EditText) v.findViewById(R.id.editText1);
                                       
                       
                        return v;
               
        }
       
        public String getText()
        {
                return _et.getText().toString();
                       
        }
       
    }
}

i vari insertFragment sono tutti uguali cambia solo l'oggetto all'interno:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >

    <Button
       android:id="@+id/button1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Button" />

</LinearLayout>

insert.xml
Codice (XML): [Seleziona]
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/pager"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

    <!--
   This title strip will display the currently visible page title, as well as the page
   titles for adjacent pages.
   -->
    <android.support.v4.view.PagerTitleStrip android:id="@+id/pager_title_strip"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_gravity="top"
       android:background="#33b5e5"
       android:textColor="#fff"
       android:paddingTop="4dp"
       android:paddingBottom="4dp" />

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


il problema sta qui :
Codice (Java): [Seleziona]
                                public void onClick(View v) {
                                       
                                        /*TROVARE IL MODO DI LEGGERE COSA C'è NELLA EDITTEXT IN PAGE3*/

                                        Toast.makeText(getActivity(), "testo eT:", Toast.LENGTH_LONG).show();
                                       
                                }
                });

è la prima volta che uso questa struttura, e ho ancora un po' di confusione in testa.

Aspetto vostri consigli...

Grazie
Ale

Offline ale88sv

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +1
    • Google+
    • Mostra profilo
    • Le Mie Apps
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ale88sv
  • Sistema operativo:
    Windows 7 / Ubuntu 12.4
Re:ViewPager e fragments
« Risposta #1 il: 03 Ottobre 2012, 17:56:05 CEST »
0
Forse ho risolto ma non mi piace tanto come soluzione:

Codice (Java): [Seleziona]
package alessandro.vegna.barcode;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.content.Context;
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.FragmentPagerAdapter;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;


public class InsertActivity extends FragmentActivity {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide fragments for each of the
     * sections. We use a {@link android.support.v4.app.FragmentPagerAdapter} derivative, which will
     * keep every loaded fragment in memory. If this becomes too memory intensive, it may be best
     * to switch to a {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */

    SectionsPagerAdapter mSectionsPagerAdapter;
    public EditText _et;

    /**
     * The {@link ViewPager} that will host the section contents.
     */

    ViewPager mViewPager;

    @SuppressLint("NewApi")
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.insert);
        getActionBar().setDisplayHomeAsUpEnabled(true);
        // Create the adapter that will return a fragment for each of the three primary sections
        // of the app.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());


        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.insert, menu);
        return true;
    }

   
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void test(View v) {
 
        Page3 p3 = (Page3) mSectionsPagerAdapter.getItem(2);
        Toast.makeText(this, p3.getText(),Toast.LENGTH_LONG).show();
        }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to one of the primary
     * sections of the app.
     */

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        private Page1 _p1;
        private Page2 _p2;
        private Page3 _p3;
       
        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
           
        }

        @Override
        public Fragment getItem(int i) {
                Log.v("NULL","item:"+i);
            switch (i) {
                        case 0:
                                if(_p1 == null)
                                        _p1 = new Page1();
                                return _p1;
                        case 1:
                                if(_p2 == null)
                                        _p2 = new Page2();
                                return _p2;
                        case 2:
                                if(_p3 == null)
                                        _p3 = new Page3();
                                return _p3;
                        default:
                                return null;
                        }
           
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0: return getString(R.string.title_section1).toUpperCase();
                case 1: return getString(R.string.title_section2).toUpperCase();
                case 2: return getString(R.string.title_section3).toUpperCase();
            }
            return null;
        }
    }


    public static class Page1 extends Fragment {
        public Page1() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
       
                View v = inflater.inflate(R.layout.insert_fragment_1, null);
                               
                        return v;
               
        }
       
    }
   
    public static class Page2 extends Fragment {
        public Page2() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
       
                View v = inflater.inflate(R.layout.insert_fragment_2, null);

                        return v;
               
        }
       
    }
   
    public static class Page3 extends Fragment {
       
        private EditText _et;
       
        public Page3() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
       
                View v = inflater.inflate(R.layout.insert_fragment_3, null);
               
                _et = (EditText) v.findViewById(R.id.editText1);
                                       
                       
                        return v;
               
        }
       
        public String getText()
        {
                return _et.getText().toString();
                       
        }
       
    }
}

Voi che dite ?
Ho tolto il listener dalla classe Page1, nell'onclick del tasto ho messo la funzione test..

Pro: funziona  :-P
Contro: devo prima andare sul terzo fragment altrimenti mi da null Exception

Offline Max

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Ace
Re:ViewPager e fragments
« Risposta #2 il: 06 Ottobre 2012, 18:42:00 CEST »
0
io ho un problema sullo stesso argomento provero' ad esporlo
concettualmente vorrei fare questo:

listview ---> click ---> view di dettaglio e fin qui tutto bene
vorrei scrollare orizzontalmente rimanendo su questa view di dettaglio senza dover tornare alla listview

EDIT: ho trovato una soluzione navigando su internet: RealViewSwitcher!!! che ne pensate?

grazie
« Ultima modifica: 07 Ottobre 2012, 12:11:06 CEST da Max »

Offline ale88sv

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +1
    • Google+
    • Mostra profilo
    • Le Mie Apps
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ale88sv
  • Sistema operativo:
    Windows 7 / Ubuntu 12.4
Re:ViewPager e fragments
« Risposta #3 il: 08 Ottobre 2012, 15:34:16 CEST »
0
intendi stile chat sui tablet ?

per fare quello puoi usare i fragment penso in modo abbastanza semplice (anche se non ho provato, questo tuo esempio) seguendo la guida che ho linkato all'inizio.