我已经实现了c-sharpcorner.com/article/xamarin-android-create-viewpager-tablayout-floatingactionbutton-supportacti/中显示的材料设计标签,并添加了3个标签。
它运行正常但我需要在前4个选项卡/片段上验证用户的输入数据,以允许用户选择最后一个选项卡/片段(=第五个进行计算并显示结果)。当第二个标签/片段上的输入数据无效时,应用程序必须转到该标签/片段并通知用户更正输入数据。
我尝试了几种方法来选择相应的片段,制表符或viewpager,但它们都失败了,其中一些会使应用程序崩溃。作为Xamarin的新手,我无法弄清楚如何做到这一点,经过3天的互联网搜索后,我希望有人可以帮助我。
预先感谢您的回复!
答案 0 :(得分:1)
它运行正常但我需要在前4个选项卡/片段上验证用户的输入数据,以允许用户选择最后一个选项卡/片段(=第五个进行计算并显示结果)。当第二个标签/片段上的输入数据无效时,应用程序必须转到该标签/片段并通知用户更正输入数据。
您可以使用ViewPager.PageSelected
事件来执行此操作:
首先,使您的适配器和viewpager成为您的活动的全局:
public class MainActivity : AppCompatActivity
{
ViewPager viewpager;
Adapter mAdapter;
...
}
在您发布的教程的SetupViewPager
方法中注册了事件:
void setupViewPager(Android.Support.V4.View.ViewPager viewPager)
{
mAdapter = new Adapter(SupportFragmentManager);
...
//register the event
viewpager.PageSelected += Viewpager_PageSelected;
}
实施活动:
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;
}
}
<强>更新强>
您可以尝试我的演示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;
}
}