如何使用片段

时间:2017-11-21 11:20:13

标签: android xamarin.android android-viewpager

我已经实现了c-sharpcorner.com/article/xamarin-android-create-viewpager-tablayout-floatingactionbutton-supportacti/中显示的材料设计标签,并添加了3个标签。

它运行正常但我需要在前4个选项卡/片段上验证用户的输入数据,以允许用户选择最后一个选项卡/片段(=第五个进行计算并显示结果)。当第二个标签/片段上的输入数据无效时,应用程序必须转到该标签/片段并通知用户更正输入数据。

我尝试了几种方法来选择相应的片段,制表符或viewpager,但它们都失败了,其中一些会使应用程序崩溃。作为Xamarin的新手,我无法弄清楚如何做到这一点,经过3天的互联网搜索后,我希望有人可以帮助我。

预先感谢您的回复!

1 个答案:

答案 0 :(得分:1)

  

它运行正常但我需要在前4个选项卡/片段上验证用户的输入数据,以允许用户选择最后一个选项卡/片段(=第五个进行计算并显示结果)。当第二个标签/片段上的输入数据无效时,应用程序必须转到该标签/片段并通知用户更正输入数据。

您可以使用ViewPager.PageSelected事件来执行此操作:

  1. 首先,使您的适配器和viewpager成为您的活动的全局:

    public class MainActivity : AppCompatActivity
    {
        ViewPager viewpager;
        Adapter mAdapter;
        ...
    }
    
  2. 在您发布的教程的SetupViewPager方法中注册了事件:

    void setupViewPager(Android.Support.V4.View.ViewPager viewPager)
    {
        mAdapter = new Adapter(SupportFragmentManager);
        ...
        //register the event
        viewpager.PageSelected += Viewpager_PageSelected;
    }
    
  3. 实施活动:

    private void Viewpager_PageSelected(object sender, ViewPager.PageSelectedEventArgs e)
    {
         //if user is navigating to the 4th page(position start from 0)
        if (e.Position == 3)
        {
            //unregister the event first to let it not in a infinite loop.
            viewpager.PageSelected -= Viewpager_PageSelected;
            var etInput = FindViewById<EditText>(Resource.Id.etInput);
            int tmp;
            //if user didn't enter a number then go back
            if (!int.TryParse(etInput.Text,out tmp))
            {
                viewpager.CurrentItem = 0;
            }
            viewpager.PageSelected += Viewpager_PageSelected;
        }
    }
    
  4. <强>更新

    您可以尝试我的演示here

    还有一些事情需要提及。您需要保存并更新片段中控件的状态,然后将其公开(直接调用FindViewById<EditText>会导致问题,有时您无法获取它,因为适配器可能因性能原因而隐藏它):

    public class TabFragment1 : Android.Support.V4.App.Fragment
    {
        //make the currentText public so that you can retrieve it later in activity
        public string CurrentText { get; set; }
    
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
    
            // Create your fragment here
        }
    
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            // return inflater.Inflate(Resource.Layout.YourFragment, container, false);
    
            var v = inflater.Inflate(Resource.Layout.TabLayout1, container, false);
            var etInput=v.FindViewById<EditText>(Resource.Id.etInput);
            etInput.TextChanged += EtInput_TextChanged;
            return v;
        }
    
        private void EtInput_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
        {
            //save the EditText's text
            this.CurrentText = ((EditText)sender).Text;
        }
    }
    

    然后您可以在活动中检索它:

    private void Viewpager_PageSelected(object sender, ViewPager.PageSelectedEventArgs e)
    {
        if (e.Position == 3)
        {
            viewpager.PageSelected -= Viewpager_PageSelected;
            var text = (mAdapter.fragments[0] as TabFragment1).CurrentText;
            int tmp;
            if (!int.TryParse(text, out tmp))
            {
                viewpager.CurrentItem = 0;
                Toast.MakeText(this, "Please input a number in Fragment1", ToastLength.Long).Show();
            }
            viewpager.PageSelected += Viewpager_PageSelected;
        }
    }