2012-10-19 10 views
5

Czy przeczytać każde pytanie/odpowiedź w tym temacie, ale nie mogę dostać żadnej z nich do pracy me.aggghhNie można poprawnie zamienić fragmenty na kartach actionbar

mam 3 karty actionbar

połączeń Wypustu1/korzysta z fragmentu, który dynamicznie wyświetla przycisk „dodaj”

po kliknięciu przycisku chcę go usunąć sam „przycisk fragment” i zastąpienie go z fragmentem, który ma kilka EditTexts

to działa zgodnie z oczekiwaniami. Jednak gdy kliknę inną kartę, np. Tab2, która wywołuje własny fragment, fragment EditTexts z tab1 pozostaje i nakłada się fragment tabulatora nr2

Rozumiem, że to, co próbuję zrobić, jest zasadniczo złe, że fragment nie może nazwać innego fragmentu wymienić się? lub że w jakiś sposób nie usuwam poprawnie poprzednich fragmentów i nie mam nic wspólnego z backstackiem ... ???? lub pokazywanie i ukrywanie xml ?????

Jestem bardzo nowy i całkowicie zdezorientowany! Proszę o pomoc ... z góry dziękuję :)

Tu jest mój kod najbardziej pobranych z Android miejscu http://developer.android.com/training/backward-compatible-ui/index.html stosując próbkę TabCompat.zip

MainActivity.java

package com.example.android.tabcompat; 
public class MainActivity extends TabCompatActivity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

TabHelper tabHelper = getTabHelper(); 

CompatTab tab1Tab = tabHelper.newTab("tab1") 
.setText(R.string.tab_tab1) 
.setTabListener(new InstantiatingTabListener(this,"A", Tab1Fragment.class)); 
tabHelper.addTab(tab1Tab); 

     CompatTab tab2Tab = tabHelper.newTab("tab2") 
      .setText(R.string.tab_tab2) 
      .setTabListener(new InstantiatingTabListener(this, "B", Tab2Fragment.class)); 
     tabHelper.addTab(tab2Tab); 

     CompatTab tab3Tab = tabHelper.newTab("tab3") 
       .setText(R.string.tab_tab3) 
       .setTabListener(new InstantiatingTabListener(this,"C", Tab3Fragment.class)); 
     tabHelper.addTab(tab3Tab); 
    } 

    /** 
    * Implementation of {@link CompatTabListener} to handle tab change events. This implementation 
    * instantiates the specified fragment class with no arguments when its tab is selected. 
    */ 
    public static class InstantiatingTabListener implements CompatTabListener { 

     private final TabCompatActivity mActivity; 
     private final Class mClass; 


     /** 
     * Constructor used each time a new tab is created. 
     * @param activity The host Activity, used to instantiate the fragment 
     * @param cls  The class representing the fragment to instantiate 
     */ 
     public InstantiatingTabListener(TabCompatActivity activity, String tag, Class<? extends Fragment> cls) { 
      mActivity = activity; 
      mClass = cls; 

     } 

     /* The following are each of the ActionBar.TabListener Callback */ 
     @Override 
     public void onTabSelected(CompatTab tab, FragmentTransaction ft) { 
      // Check if the fragment is already initialised 
      Fragment fragment = tab.getFragment(); 
      if (fragment == null) { 
       // If not, instantiate and add it to the activity 
       fragment = Fragment.instantiate(mActivity, mClass.getName()); 
       tab.setFragment(fragment); 
       ft.add(android.R.id.tabcontent, fragment, tab.getTag()); 
      } 
      else { 
       // If it exists, simply attach it in order to show it 
       ft.attach(fragment); 
      } 
     } 


     public void onTabUnselected(CompatTab tab, FragmentTransaction ft) { 
      Fragment fragment = tab.getFragment(); 
      if (fragment != null) { 
      ft.detach(fragment); 
      } 
     } 

     @Override 
     public void onTabReselected(CompatTab tab, FragmentTransaction ft) { 
      // User selected the already selected tab. Do nothing. 

    } } 
     } 

Tab1Fragment .java to gdzie 'przycisk dodaj' jest załadowany

package com.example.android.tabcompat; 

     public class Tab1Fragment extends Fragment{ 

     protected int position; 
     //display the add tab1 button 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
      final Button btn = new Button (getActivity()); 
      btn.setGravity(Gravity.TOP); 
      btn.setText(R.string.btn_tab1); 
      btn.setId(1); 
      btn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
    //when button is clicked replace the button and display the tab1 form fragment 


    FragmentManager fragmentManager = getFragmentManager(); 
    Tab1FormFragment formFragment = new Tab1FormFragment(); 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    transaction.replace(android.R.id.tabcontent, formFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
       } 

      }); 
      return btn; 

     } 
    } 

Tab1FormFragment.java ten fragment wyświetlić formularz poglądów EditText które dostaje od plików układ form.xml

package com.example.android.tabcompat; 



    public class Tab1FormFragment extends Fragment { 
    protected static final String ARG_POSITION = null; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     View myFragmentView = inflater.inflate(R.layout.form, container, false); 

     return myFragmentView; 
    } 

    } 

form.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/petForm" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 
<ImageButton 
      android:id="@+id/imageButton1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_tab_photos" /> 

     <EditText 
      android:id="@+id/editTextName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:ems="10" 
      android:hint="@string/field_name" 
      android:inputType="text" /> 


     <EditText 
      android:id="@+id/editTextAge" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:ems="10" 
      android:hint="@string/field_age" 
      android:inputType="text" /> 
     <EditText 
      android:id="@+id/editTextBreed" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:ems="10" 
      android:hint="@string/field_breed" 
      android:inputType="text" /> 

     <Spinner 
      android:id="@+id/spinnerSex" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:entries="@array/sex_arrays" 
      android:hint="@string/field_sex" /> 

     <Button 
      android:id="@+id/savePet" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/save_record" /> 
    </LinearLayout>` 
+0

ok, a więc trochę więcej czytania, http://stackoverflow.com/questions/12114150/action-bar-tabs-having-two-fragments-one-being-dynamic-in-one- tab i zobacz że oba moje fragmenty muszą być dynamiczne. więc zastąpiłem plik form.xml dynamicznie utworzonym formularzem, zamiast używać layoutparams. Nadal mam problem z nakładaniem się .... westchnienie – Wenz

+1

Mam sugestię .. Prawdopodobnie mógłbyś połączyć fragment przycisku i logikę fragmentu formularza w tym samym fragmencie za pomocą ViewFlippera.Pierwszym dzieckiem ViewFlipper będzie twój przycisk, kiedy użytkownik naciśnie przycisk, możesz użyć metody ViewFlipper "setDisplayedChild", aby pokazać fragment formularza. W ten sposób unikasz konieczności wymiany fragmentu i wciąż masz taki sam pożądany efekt. –

+0

Gdzie mieszka R.id.tabcontent? Czy to na planie MainActivity? – japino

Odpowiedz

0

Można spróbować wywoływania braku działania -bar tab (ta, którą powiedziałeś ma pęczek EditText) wraz z podaniem tej instancji fragmentu tagu tj. w metodzie onClick przycisku dynamicznego dodaj tę linię po zainicjowaniu Tab1formFragment:

getFragmentManager().beginTransaction().replace(android.R.id.tabcontent, formFragment, "FORM_FRAG").addToBackStack(null).commit();

i zmieniając swoje transakcje kartę Pasek działań dodając czek na przykład formFragment: if(getFragmentManager().findFragmentByTag("FORM_FRAG")!=null) getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentByTag("FORM_FRAG")).commit()

Dodatkowo można użyć zastąpić() transakcje fragmentów w onTabSelected() metodę zamiast dołączać() i dodaj().

Powiązane problemy