2

我知道有很多問題已經在討論這個問題,但我仍然無法弄清楚我的實現有什麼問題。xamarin android碎片疊加

我正在使用帶有4個選項卡的ActionBar的SherlockFragmentActivity,每個選項卡用不同的片段填充FrameLayout。

到這裏我沒有問題,標籤之間切換完美。

但在選項卡「購買」點擊搜索按鈕,當我使用的活性1的NavigateTo方法的另一個ListFragment,導致當前片段重疊而不會消失,不管什麼,我從這個角度做更換的FrameLayout。

請指教,我看了所有的解決方案,並不能發現問題,讓我知道如果代碼的另一部分需要

這裏是我的代碼: 活動1:

public class Activity1 : SherlockFragmentActivity, ActionBar_Sherlock.App.ActionBar.ITabListener 
    { 
protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      userid = 2; 

      // Set our view from the "main" layout resource 
      SetContentView(Resource.Layout.Main); 
      SupportActionBar.NavigationMode = (int)ActionBarNavigationMode.Tabs; 
      SupportActionBar.SetDisplayShowTitleEnabled(true); 
      //Set the mobile service Sale table adapter 
      //this.adapter = new SalesAdapter(this.MobileServiceContext.SaleTable, Resource.Layout.OffersListItem, this); 

      //Initialize tabs 
      Tab tab = SupportActionBar.NewTab(); 
      tab.SetTag("MyProfile"); 
      tab.SetText("My Profile"); 
      tab.SetTabListener(this); 
      SupportActionBar.AddTab(tab); 

      tab = SupportActionBar.NewTab(); 
      tab.SetTag("Buy"); 
      tab.SetText("Buy"); 
      tab.SetTabListener(this); 
      SupportActionBar.AddTab(tab); 

      tab = SupportActionBar.NewTab(); 
      tab.SetTag("Sell"); 
      tab.SetText("Sell"); 
      tab.SetTabListener(this); 
      SupportActionBar.AddTab(tab); 

      tab = SupportActionBar.NewTab(); 
      tab.SetTag("Rates"); 
      tab.SetText("Rates"); 
      tab.SetTabListener(this); 
      SupportActionBar.AddTab(tab); 

     } 

     public void OnTabSelected(Tab tab, Android.Support.V4.App.FragmentTransaction ft) 
     { 
      string tag = tab.Tag.ToString(); 

      Android.Support.V4.App.Fragment f = SupportFragmentManager.FindFragmentByTag(tag); 
      if (f != null) 
      { 
       ft.Show(f); 
       return; 
      } 

      if (tag == "MyProfile") 
       f = new Fragments.MyProfileFragment(); 
      else if (tag == "Buy") 
       f = new Fragments.BuyFragment(); 
      else if (tag == "Sell") 
       f = new Fragments.SaleFragment(); 
      else if (tag == "Rates") 
       f = new Fragments.BuyFragment(); 



      ft.Add(Resource.Id.fragmentContainer, f, tag); 
     } 


     public void OnTabUnselected(Tab tab, Android.Support.V4.App.FragmentTransaction ft) 
     { 
      string tag = tab.Tag.ToString(); 

      Android.Support.V4.App.Fragment f = SupportFragmentManager.FindFragmentByTag(tag); 
      if (f != null) 
      { 
       ft.Hide(f); 
       return; 
      } 
     } 

     public void OnTabReselected(Tab tab, Android.Support.V4.App.FragmentTransaction ft) 
     { 
      //Do nothing 
     } 

     public void NavigateTo(Android.Support.V4.App.Fragment newFragment) 
     { 
      Android.Support.V4.App.FragmentManager manager = SupportFragmentManager; 
      Android.Support.V4.App.FragmentTransaction ft = manager.BeginTransaction(); 

      ft.Replace(Resource.Id.fragmentContainer, newFragment); 
      ft.SetTransition((int)FragmentTransit.FragmentFade); 
      // Add this trnasaction to the back stack, so when the user press back, 
      // it rollbacks. 
      ft.AddToBackStack(null); 
      ft.Commit(); 
     } 

     public override void OnBackPressed() 
     { 
      Android.Support.V4.App.FragmentManager manager = SupportFragmentManager; 
      if (manager.BackStackEntryCount > 0) 
      { 
       base.OnBackPressed(); 
      } 
      else 
      { 

      } 
     } 
} 

這是主要的佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <FrameLayout 
     android:id="@+id/fragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" /> 
</LinearLayout> 

這是BuyFragment:

public class BuyFragment : Android.Support.V4.App.Fragment 
    { 
     private Activity1 myActivity; 
     private string currency; 
     private int amount; 
     private EditText buyAmount; 
     private Button searchButton; 
     private Spinner currencySpinner; 

     public override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 
      myActivity = (Activity1)this.Activity; 
     } 

     public override void OnActivityCreated(Bundle savedInstanceState) 
     { 
      base.OnActivityCreated(savedInstanceState); 
      //Init the currency spinner 
      currencySpinner = this.Activity.FindViewById<Spinner>(Resource.Id.spinnerBuy); 
      myActivity.InitCurrencySpinner(currencySpinner); 

      //Parse the amount text to int 
      buyAmount = this.Activity.FindViewById<EditText>(Resource.Id.buyEdittext); 
      buyAmount.AfterTextChanged += (sender, args) => 
      { 
       // 
       int result; 
       int.TryParse(buyAmount.Text, out result); 

       amount = result; 
      }; 

      searchButton = this.Activity.FindViewById<Button>(Resource.Id.buyButton); 
      searchButton.Click += (sender, e) => 
      { 
       OnClickSearch(sender, e); 
      }; 

      //Disable all buttons if the adapter is updating 
      myActivity.SalesAdapter.IsUpdatingChanged += (s, e) => 
      { 
       this.buyAmount.Enabled = 
       this.currencySpinner.Enabled = 
       this.searchButton.Enabled = 
        !myActivity.SalesAdapter.IsUpdating; 
      }; 
     } 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
     { 
      return inflater.Inflate(Resource.Layout.BuyLayout, container, false); 
     } 

     private void OnClickSearch(object sender, EventArgs eventArgs) 
     { 
      try 
      { 
       if (amount > 0) 
       { 
        currency = currencySpinner.SelectedItem.ToString(); 
        SearchOffers(); 
        this.buyAmount.Text = null; 
       } 
       else 
       { 
        Toast.MakeText(this.Activity, "Amount must be a number larger than 0", ToastLength.Short).Show(); 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("SaleFragment.OnClickPutForSale: {0} Exception caught.", e.InnerException); 
      } 
     } 

     private void SearchOffers() 
     { 
      //Check what fragment is shown, replace if needed. 
      var fragmentContainer = FragmentManager.FindFragmentById(Resource.Id.fragmentContainer) as SearchListFragment; 
      if (fragmentContainer == null) 
      { 
       // Make new fragment to show this selection. 
       fragmentContainer = SearchListFragment.NewInstance(amount, currency); 

       // Execute a transaction, replacing any existing 
       // fragment with this one inside the frame. 
       myActivity.NavigateTo(fragmentContainer); 
      } 
      //else 
      //{ 
      // fragmentContainer.Arguments.PutString("currency", currency); 
      // fragmentContainer.Arguments.PutInt("amount", amount); 
      // myActivity.NavigateTo(fragmentContainer); 
      //} 
     } 

購買佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:padding="10dip" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dip" 
     android:text="@string/currency_prompt" 
     android:layout_marginBottom="10dp" /> 
    <Spinner 
     android:id="@+id/spinnerBuy" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:prompt="@string/currency_prompt" 
     android:layout_marginTop="10dp" 
     android:layout_marginBottom="10.0dp" /> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dip" 
     android:text="@string/amount_prompt" 
     android:layout_marginBottom="10dp" /> 
    <EditText 
     android:id="@+id/buyEdittext" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dp" 
     android:layout_marginBottom="10dp" 
     android:inputType="number" /> 
    <Button 
     android:text="@string/BuyButton" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/buyButton" 
     android:layout_marginTop="10dp" 
     android:layout_marginBottom="10dp" /> 
</LinearLayout> 
+0

我也有類似的問題,因爲你做的。 你使用哪個版本的ActionBarSherlock? – balint

+0

@balint我不知道,我該如何檢查? –

+0

@balint我正在使用最新的4.3.1版本 –

回答

3

替換:

ft.Add(Resource.Id.fragmentContainer, f, tag); 

有了:

ft.Replace(Resource.Id.fragmentContainer, f, tag);