Autore Topic: TabLayout interno a LinearLayout  (Letto 444 volte)

Offline Trio87

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
TabLayout interno a LinearLayout
« il: 16 Aprile 2012, 13:14:41 CEST »
0
Ciao a tutti.
Sto facendo oggi la mia prima esperienza con il TabLayout seguendo tutorial della google (Tab Layout | Android Developers).

Ho necessità di creare un TabLayout che non occupi tutto lo schermo della mia activity. Mi spiego meglio:
ho un layout che deve contenere dati relativi ad un Customer (nome, indirizzo, telefono ecc). Tra questi dati ci sono anche un elenco di fornitori e uno di contatti (entrambi con informazioni relative ad ogni fornitore/contatto). Volevo inserire fornitori e contatti in tabelle (fino a qui tutto ok) e ogni tabella in un tab, in modo da separare le viste. Il TabLayout dove inserire i tab dovrebbe essere nella parte in basso di un layout che contiene i dati del Customer, in modo che i dati del Customer siano sempre visibili in alto, e in basso si possa scegliere se visualizzare i fornitori o i contatti.
Spero di essermi spiegato.
Vi posto un po di codice:

details_layout.xml
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/detailsBG" >

<!-- parte alta e non interessante del layout -->

        <LinearLayout
        android:orientation="vertical"
        android:layout_height="0dp"
        android:layout_width="fill_parent"
        android:layout_weight="1"
        android:layout_marginLeft="30sp"
        android:layout_marginRight="30sp"
        android:layout_marginBottom="10sp" >
                <TextView
                android:layout_height="wrap_content"
                android:layout_width="fill_parent"
                android:gravity="center"
                android:text="Informazioni supplementari"
                android:textColor="@color/textLight"
                android:textSize="@dimen/textGiant" />
                <LinearLayout
                android:orientation="vertical"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent"
                android:background="@drawable/group_background"
                android:padding="10dp" >
                        <TabHost
                        android:id="@+id/customerDetailsTabHost"
                        android:layout_height="fill_parent"
                        android:layout_width="fill_parent" >
                                <LinearLayout
                                android:orientation="vertical"
                                android:layout_height="fill_parent"
                                android:layout_width="fill_parent" >
                                        <TabWidget
                                        android:id="@+id/customerDetailsTabHostTabs"
                                        android:layout_height="wrap_content"
                                        android:layout_width="fill_parent" />
                                        <FrameLayout
                                        android:id="@+id/customerDetailsTabHostTabContent"
                                        android:layout_height="fill_parent"
                                        android:layout_width="fill_parent" />
                                </LinearLayout>
                        </TabHost>
                </LinearLayout>
        </LinearLayout>
</LinearLayout>

DetailsActivity.java (la parte relativa all'XML mostrato sopra)
Codice (Java): [Seleziona]
//gestione del layout non interessante

TabHost tabHost = (TabHost) layout.findViewById(R.id.customerDetailsTabHost);
if (tabHost == null)
        Log.e("CustomerDetails", "tabHost == null");
TabHost.TabSpec spec;
Intent intent;

//add partners tab
intent = new Intent(context, CustomerContactsActivity.class);
spec = tabHost.newTabSpec("customerContacts").setIndicator("Contacts").setContent(intent);
if (spec == null)
        Log.e("CustomerDetails", "spec == null");
Log.e("CustomerDetails", "adding tab");
tabHost.addTab(spec); //L A   R I G A   C H E   D A   E R R O R E   E'   Q U E S T A
Log.e("CustomerDetails", "tab added");

//aggiunta di altri tab

LogCat
Codice: [Seleziona]
04-16 10:38:48.726: ERROR/AndroidRuntime(752): FATAL EXCEPTION: main
04-16 10:38:48.726: ERROR/AndroidRuntime(752): java.lang.NullPointerException
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.widget.TabHost.addTab(TabHost.java:231)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at it.peernetwork.mobilesales.customerdetails.CustomerDetailsActivity.getTaskDetailsLayout(CustomerDetailsActivity.java:64)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at it.peernetwork.mobilesales.customerdetails.CustomerDetailsFragment.onCreateView(CustomerDetailsFragment.java:17)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:735)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:926)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.app.BackStackRecord.run(BackStackRecord.java:578)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1226)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:374)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.os.Handler.handleCallback(Handler.java:587)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.os.Looper.loop(Looper.java:132)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at android.app.ActivityThread.main(ActivityThread.java:4025)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at java.lang.reflect.Method.invokeNative(Native Method)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at java.lang.reflect.Method.invoke(Method.java:491)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-16 10:38:48.726: ERROR/AndroidRuntime(752):     at dalvik.system.NativeStart.main(Native Method)


Spero di non aver dimenticato niente...

Sono certo che sto sbagliando una ca**ata mostruosa e che me ne vergognerò per sempre, ma qualcuno mi potrebbe indicare l'errore plz?

Se il problema è che non si può usare il TabLayout in questo modo, ho pensato di inserirlo in un fragment (sto sviluppando per android >= 3x), ma poi anche con le librerie di compatibilità non sarebbe accettabile in android 2x vero?

Grazie a tutti in anticipo.

Trio

Offline Trio87

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
Re:TabLayout interno a LinearLayout
« Risposta #1 il: 17 Aprile 2012, 16:11:24 CEST »
0
Risolto:

è stato sufficiente che la mia activity estendesse ActivityGroup aggiungere un tabHost.setup:
Codice (Java): [Seleziona]
public class CustomerDetailsActivity extends ActivityGroup {
//...
        localActivityManager localActivityManager = getLocalActivityManager();

        TabHost tabHost = (TabHost) layout.findViewById(R.id.customerDetailsTabHost);
        tabHost.setup(localActivityManager);
        TabHost.TabSpec spec;
        Intent intent;

Se anche voi avete necessità di inserire il TabLayout in un fragment potete fare cosi:
 - L'activity che contiene il fragment deve estendere ActivityGroup
 - Nel fragment aggiungete
Codice (Java): [Seleziona]
ActivityGroup activityGroup;
public void onAttach(Activity activity) {
        super.onAttach(activity);
        activityGroup = (ActivityGroup)activity;
}
e potete trovare il LocalActivityManager con
Codice (Java): [Seleziona]
activityGroup.getLocalActivityManager()