2012-10-19 30 views
5

đã đọc mọi câu hỏi/câu trả lời về vấn đề này nhưng tôi không thể nhận được bất kỳ trong số họ làm việc cho me.aggghhKhông thể trao đổi một cách chính xác các mảnh vỡ trên các tab actionbar

Tôi có 3 tab actionbar

cuộc gọi tab1/sử dụng một đoạn mà tự động hiển thị một nút "add"

khi nút được nhấp tôi muốn nó để loại bỏ bản thân 'đoạn nút' và thay thế bằng một đoạn mà có một loạt các EditTexts

tác phẩm này như mong đợi. Tuy nhiên, khi tôi nhấp vào một tab khác, ví dụ tab2 gọi là phân đoạn của riêng nó, đoạn EditTexts từ tab1 vẫn còn và chồng lên đoạn tab2

Tôi nghĩ rằng điều tôi đang cố làm là sai lầm về cơ bản. để thay thế chính nó? hoặc bằng cách nào đó tôi không loại bỏ một cách chính xác các mảnh trước đó và một cái gì đó để làm với backstack .. ???? hoặc hiển thị và ẩn xml ?????

Tôi rất mới với điều này và hoàn toàn bối rối! Xin vui lòng giúp ... cảm ơn bạn trước :)

Dưới đây là mã của tôi lấy nhất từ ​​các trang web android http://developer.android.com/training/backward-compatible-ui/index.html bằng cách sử dụng mẫu 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 đây là nơi 'nút thêm' được tải

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 đoạn này hiển thị một hình thức quan điểm EditText mà nó nhận được từ file layout 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, do đó, đã thực hiện đọc nhiều hơn một chút, http://stackoverflow.com/questions/12114150/action-bar-tabs-having-two-fragments-one-being-dynamic-in-one-tab và xem cả hai mảnh của tôi cần phải năng động. do đó đã thay thế form.xml bằng một biểu mẫu được tạo động thay vì sử dụng layoutparams. Tôi vẫn còn có vấn đề chồng chéo điện tho .... thở dài – Wenz

+1

Tôi có một gợi ý .. Bạn có lẽ có thể kết hợp mảnh nút của bạn và logic dạng mảnh trong cùng một đoạn bằng cách sử dụng một ViewFlipper.Con đầu tiên của ViewFlipper sẽ là nút của bạn, khi người dùng nhấn vào nút, bạn có thể sử dụng phương thức của ViewFlipper "setDisplayedChild" để hiển thị mảnh biểu mẫu của bạn. Bằng cách đó bạn tránh phải thay thế mảnh vỡ và bạn vẫn nhận được cùng một hiệu ứng mong muốn. –

+0

R.id.tabcontent sống ở đâu? Có phải bố cục cho MainActivity không? – japino

Trả lời

0

Bạn có thể thử gọi phi-action -bar tab (một trong những bạn nói có một loạt các EditText) cùng với cho rằng dụ của một mảnh một thẻ tức là trong phương pháp onClick nút năng động của bạn thêm dòng này sau khi bắt đầu Tab1formFragment của bạn:

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

Và thay đổi hành động giao dịch thẻ thanh của bạn bằng cách thêm một tấm séc cho formFragment dụ: if(getFragmentManager().findFragmentByTag("FORM_FRAG")!=null) getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentByTag("FORM_FRAG")).commit()

Ngoài ra bạn có thể sử dụng thay thế() giao dịch đoạn trong onTabSelected của bạn() phương pháp thay vì đính kèm() và thêm().

Các vấn đề liên quan