android - xamarin android fragment 重叠

标签 android actionbarsherlock xamarin.android android-fragmentactivity

我知道已经有很多问题在讨论这个问题,但我仍然无法弄清楚我的实现出了什么问题。

我正在使用具有 4 个选项卡的 ActionBar 的 SherlockFragmentActivity,每个选项卡都使用不同的 Fragment 填充 FrameLayout。

到目前为止我没有任何问题,选项卡在 fragment 之间完美切换。

但是在“购买”选项卡上,当单击 searchButton 时,我使用 Activity1 NavigateTo 方法将 FrameLayout 替换为另一个 ListFragment,这会导致当前 Fragment 重叠,并且无论我从此时开始做什么都不会消失。

请告知,我已阅读所有解决方案,但找不到问题,请告诉我是否需要另一部分代码

这是我的代码: Activity 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>

最佳答案

替换:

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

与:

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

关于android - xamarin android fragment 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17572171/

相关文章:

c# - 隐藏在 Xamarin Forms Android 中时如何禁用单击 TabbedPage 菜单项?

android相机在相机取消的外部SD卡文件夹中创建0kb文件

android - 了解 fragment 堆栈

Android ActionBarSherlock - 如何更改 API <3.0 的主题以及 API >=3.0 的主题

没有填充的 Android 按钮

xamarin.forms - 图像色调按钮 Android Xamarin Forms

c# - 如何在启动画面上请求许可并在被拒绝时退出?

java - 如何通过编程方式获取 Activity 标题名称 java android

android - 如何在 TextView 中跨越多个字符串?

Android 无法从 ListView 行中按钮的 onClick 找到方法