Autore Topic: ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?  (Letto 655 volte)

Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?
« il: 18 Giugno 2014, 09:00:01 CEST »
0
Buongiorno vi scrivo perché sto diventando letteralmente matto nel creare lo scheletro di un'app (un pò per diletto un pò per imparare come funziona) con due o più tab.
Non sono esperto di programmazione su android ne di java (però capisco quello che scrivo penso sia già un passo avanti  :-) ) quindi sono partito dal basso ho copiato pari pari il codice di questa guida (l'ho copiato per capirci qualcosa): ViewPager | Android Developers

Inizialmente l'ho copiato paro paro ma mi sono ritrovato con questo problema: android - FragmentPagerAdapter troubles and woes: Constructor Undefined - Stack Overflow così ho fatto le modifiche proposte (e già di per se mi sembra abbastanza indecente che del codice sul sito developers.android.com dia errore di compilazione) ma la mia app crasha all'avvio appare per un nanosecondo l'actionbar e poi termina in modo anomalo (sono al lavoro appena possibile sparo l'output di logcat)

Iniziamo col codice (che adesso non da errore di compilazione):

MainActivity.java
Codice (Java): [Seleziona]
package it.hptt.calciomeravigliao;

import java.util.ArrayList;

import it.hptt.calciomeravigliao.R;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
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.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


public class MainActivity extends FragmentActivity{  //Prima modifica prima estedneva Activity
 
        ViewPager mViewPager;
        TabsAdapter mTabsAdapter;
       
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.pager);
                mViewPager = new ViewPager(this);
                mViewPager.setId(R.id.pager);
                setContentView(mViewPager);
               
                //ActionBar
                final ActionBar bar = getActionBar();
                bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
                bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
               
                //Tab
                mTabsAdapter = new TabsAdapter(this, mViewPager);
                mTabsAdapter.addTab(bar.newTab().setText("Tab1"),TabNumeroUno.class, null);
                mTabsAdapter.addTab(bar.newTab().setText("Tab2"),TabNumeroDue.class, null);
               
                if (savedInstanceState != null)
                 {
                        bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
                }
               
        }
                @Override
                protected void onSaveInstanceState(Bundle outState)
                {
                        super.onSaveInstanceState(outState);
                        outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
                }
               
                               
        @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
                MenuInflater inflater = getMenuInflater();
                inflater.inflate(R.menu.main_activity_actions, menu);
                return super.onCreateOptionsMenu(menu);
        }
       
        @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
                switch (item.getItemId())
                {      
                case R.id.action_search:
                        return true;
                default:
                        return super.onOptionsItemSelected(item);
                }
        }

        public static class TabsAdapter extends FragmentPagerAdapter
                        implements ActionBar.TabListener, ViewPager.OnPageChangeListener
        {
                private final Context mContext;
                private final ActionBar mActionBar;
                private final ViewPager mViewPager;
                private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
               
                static final class TabInfo
                {
                        private final Class<?> clss;
                        private final Bundle args;
                       
                        TabInfo(Class<?> _class, Bundle _args)
                        {
                                clss = _class;
                                args = _args;
                        }
                }
               
               
               
                public TabsAdapter(FragmentActivity activity, ViewPager pager) //Seconda modifica il primo paramentro prima era Activity
                {
                        super( activity.getSupportFragmentManager());  //Terza modifica richiamo il costruttore passando il giusto paramentro
                        mContext = activity;
                        mActionBar = activity.getActionBar();
                        mViewPager = pager;
                        mViewPager.setAdapter(this);
                        mViewPager.setOnPageChangeListener(this);
                                       
                }
               
                public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args)
                {
                        TabInfo info = new TabInfo(clss, args);
                        tab.setTag(info);
                        tab.setTabListener(this);
                        mTabs.add(info);
                        mActionBar.addTab(tab);
                        notifyDataSetChanged();
                }

               

                @Override
                public int getCount()
                {
                        // TODO Auto-generated method stub
                        return mTabs.size();
                }
               
                @Override
                public Fragment getItem(int position) {
                        // TODO Auto-generated method stub
                        TabInfo info = mTabs.get(position);
                        return Fragment.instantiate(mContext, info.clss.getName(), info.args);
                       
                }

               
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                        // TODO Auto-generated method stub
                       
                }

                @Override
                public void onPageSelected(int position) {
                        // TODO Auto-generated method stub
                        mActionBar.setSelectedNavigationItem(position);
                }
               
                public void onPageScrollStateChanged(int state)
                {
                       
                }
               
                public void onTabSelected(Tab tab, FragmentTransaction ft)
                {
                        Object tag = tab.getTag();
                        for (int i=0; i<mTabs.size(); i++)
                        {
                                if (mTabs.get(i) == tag)
                                {
                                        mViewPager.setCurrentItem(i);
                                }
                        }
                }
       
                public void onTabUnselected(Tab tab, FragmentTransaction ft)
                {
               
                }
       
                public void onTabReselected(Tab tab, FragmentTransaction ft)
                {
               
                }
        }
   
}

pager.xml
Codice (XML): [Seleziona]
<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.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"
    />
</RelativeLayout>
 

TabNumeroUno.java (ho commentato la riga di import perchè nel logcat diceva di non poter fare un cast fra android.support.v4.app.Fragment e android.app.Fragment, ovviamente il risultato non cambia salvo sparire l'errore nel logcat)
Codice (Java): [Seleziona]
package it.hptt.calciomeravigliao;

import android.support.v4.app.Fragment;
//import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

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

tabuno.xml
Codice (XML): [Seleziona]
<?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">

<TextView
   android:id="@android:id/text2"
   android:text="Ciao a tutti" />
</RelativeLayout>

TabNumeroDue.java (idem come sopra)
Codice (Java): [Seleziona]
package it.hptt.calciomeravigliao;

//import android.app.Fragment;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TabNumeroDue extends Fragment
{
       

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

Codice (XML): [Seleziona]
<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">

<TextView
   android:id="@android:id/text1"
   android:text="Ciao" />
</RelativeLayout>

AndroidManifest.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="it.hptt.calciomeravigliao"
   android:versionCode="1"
   android:versionName="1.0" >

    <uses-sdk
       android:minSdkVersion="15"
       android:targetSdkVersion="19" />

    <application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:name="it.hptt.calciomeravigliao.MainActivity"
           android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

A me sembra tutto giusto ma sicuramente sbaglio qualcosa aiutatemi sto impazzendo

Grazie Fabrizio

Post unito: [time]Giugno 18, 2014, 10:50:34[/time]
mi rispondo da solo chiedendo perdono non ho letto più stto: Tab e swipe - Android Developers Italia

Provo il codice di questo esempio e vedo di risolvere (è anche più putilod el mio)

Mi resta però il dubbio di capire cosa c'è di sbagliato per puro apprendimento
« Ultima modifica: 28 Agosto 2014, 09:02:17 CEST da Cleon I »

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Re:ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?
« Risposta #1 il: 18 Giugno 2014, 22:00:26 CEST »
0
Risolto  con il mio codice?

Inviato dal mio Nexus 4 utilizzando Tapatalk


Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
Re:ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?
« Risposta #2 il: 19 Giugno 2014, 09:06:16 CEST »
0
purtroppo no, nel costruttore

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

mi dice che non può passare un FragmentManager
mi sono sortui alcuni dubbi:

1) ho visto che di librerie da importare ce ne sono a secchi (android.app.Fragment, android.support.v4.Fragment ecc.) quali sono quelle da importare? E' possibile vedere la lista delle librerie che hai importato?
2)  uso eclipse può essere un problema?
3) è possibile vedere il codice dii R.layout.activity_main e dei Fragment perché sono riuscito in qualche maniera (non ricordo come, era l'una di notte, a risolvere i problemi di compilazione ma l'app mi crasha come sopra)

Scusate ma sto cercando di imparare seguendo guide in qua e la ma direi che c'è un pò di confusione

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Re:ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?
« Risposta #3 il: 19 Giugno 2014, 09:30:04 CEST »
0
activity main
Codice (Java): [Seleziona]
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuInflater;


public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    ViewPager mViewPager;
    ActionBar actionBar;

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

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(new MyAdapter(getFragmentManager()));
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int arg0) {
                actionBar.setSelectedNavigationItem(arg0);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });

        actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


        //TAB Orario
        ActionBar.Tab tabOrario = actionBar.newTab();
        tabOrario.setText(getString(R.string.tab_orario));
        tabOrario.setTabListener(this);

        //TAB Compiti
        ActionBar.Tab tabCompiti = actionBar.newTab();
        tabCompiti.setText(getString(R.string.tab_compiti));
        tabCompiti.setTabListener(this);

        //TAB Verifiche
        ActionBar.Tab tabVerifiche = actionBar.newTab();
        tabVerifiche.setText(getString(R.string.tab_verifiche));
        tabVerifiche.setTabListener(this);


        actionBar.addTab(tabOrario);
        actionBar.addTab(tabCompiti);
        actionBar.addTab(tabVerifiche);

    }


    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }


    public class MyAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {

            Fragment fragment = null;

            //apro il fragment in base alla posizione
            switch (position) {
                case 0:
                    fragment = new Orario();
                    break;
                case 1:
                    fragment = new Compiti();
                    break;
                case 2:
                    fragment = new Verifiche();
                    break;
            }
            return fragment;
        }

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


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater action = getMenuInflater();
        action.inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }
}

layout activity main
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" />


Fragment (e solo la base)
Codice (Java): [Seleziona]
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class Compiti extends android.app.Fragment {

    public Compiti() {
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedIstanceState) {
        View root = inflater.inflate(R.layout.fragment_compiti, container, false);
        return root;
    }
}

layout fragment
Codice (XML): [Seleziona]
<?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:background="#ffcc00">

</RelativeLayout>

manifest
Codice (XML): [Seleziona]
<application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:name=".MainActivity"
           android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

io uso android studio e ricordo che compianto vari esempi in giro mi segnava tutto errore poi ho ho trovato la configurazione di grandle da mettere e quella ha risolto tutto

build.gradle
Codice: [Seleziona]
apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        applicationId "com.nicola.diarioscolastico"
        minSdkVersion 15
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v13:19.+'
}

Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
Re:ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?
« Risposta #4 il: 19 Giugno 2014, 09:34:28 CEST »
0
ecco il bug:

import android.support.v13.app.FragmentPagerAdapter;

eclipse mi importa la v4 di questa libreria sicuramente il problema è quello

Ho messo come versione di android minima 4.0 e come compilazione 4.2.2 devo cambiare qualcosa?

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Re:ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?
« Risposta #5 il: 19 Giugno 2014, 09:38:14 CEST »
0
no...io compilo con 4.4.2 e come minima 4.0.3

Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
Re:ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?
« Risposta #6 il: 19 Giugno 2014, 09:52:06 CEST »
0
no...io compilo con 4.4.2 e come minima 4.0.3

ci sono problemi di compatibilità compilando con 4.4.2?

cioè essendo come minimo 4.0.3 l'app resta usabile da 4.0.3  in poi indipendentemente da dove compili giusto?

Stasera provo a modificare e semmai metto risolto perché temop che anche l'errore del primo codice sia lo stesso

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Re:ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?
« Risposta #7 il: 19 Giugno 2014, 10:55:07 CEST »
0
Non credo ci siamo problemi di compatibilità

Inviato dal mio Nexus 4 utilizzando Tapatalk


Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
Re:ActionBar e Tabs c\'è qualocosa di sbagliato in questo codice?
« Risposta #8 il: 28 Agosto 2014, 09:01:35 CEST »
0
sono tornato, scusate se ho abbandonato il topic ma sono stato un pò impegnato e ho tralasciato le cose divertenti

Allora la situazione è questa il codice vise950 è corretto infatti quando ho importato le librerie tutto è andato apposto (apparte il fatto che aide non riconosce la librerie v13app.FragmentPagerAdapter ma quello è un problema sicuramente di import.

Ora vi racconto che mi è successo:

Visto che cii volevo capire qualcosa il codice di vise950 non l'ho copiato col copia e incolla ma me lo sono riscritto personalizzando volta volta, fatto sta che il mio codice compilava ma l'app crashava. Scorrendo il codice dopo settimane ho scovato l'errore (inutile dire che mi sono preso a nocchini da solo)
Codice (Java): [Seleziona]
                //TAB1
                 ActionBar.Tab tab1 = actionBar.newTab();
                 tab1.setText("TAB 1");
                 tab1.setTabListener(this);
               
                //TAB2
                ActionBar.Tab tab2 = actionBar.newTab();
                tab1.setText("TAB 2");
                tab1.setTabListener(this);

sono stato così furbo da creare 2 tab ma da regalare il TabListener due volte al solito.
A mia discolpa direi che l'errore non era facilissimo da scovare visto che 3 miei amici che hanno importato e compilato il codice non l'hanno beccato :-)

1 a 0 per me
mettor risolto al primo post