【问题标题】:c# xamarin switching activitiesc# xamarin 切换活动
【发布时间】:2016-08-18 10:00:51
【问题描述】:

我想知道是否有办法通过使用微调器在 android 应用程序中的 2 个活动之间切换。 I want the when the first item of the spinner is selected the first activity to be active and vice versa.我试过了,但没有反应:

if (spinner.SelectedItem == item1) {
 Start Activity (Activity2)
}

问题是我使用 strings.xml 文件将项目添加到我的微调器,如下所示:

<string-array name:"spinnerItems">
 <item id="item1">...</item>
 <item id="item2">...</item>
</string-array>

这是我添加微调器的 Main.xml 文件:

<Spinner
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:id="@+id/spinner"
 android:entries="@array/spinnerItems"/>

所以我想知道是否必须以某种方式从主活动内部访问微调器数组列表,或者使用 FindViewById 方法启动它,这样我就可以将这些项目用于条件语句。

编辑:

void Spinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
        {
            int selectedPositon = e.Position;
            switch(e.Position)
            {
                case 1:
                    StartActivity(typeof(Activity2));
                    break;
            }
        }
spinner.ItemSelected += Spinner_ItemSelected;

这会将我发送到我的第二个 Activity 并加载我的第二个布局。但是在我的第二个活动中,我使用此代码返回第一个:

void Spinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
        {
            int selectedPositon = e.Position;
            switch (e.Position)
            {
                case 1:
                    StartActivity(typeof(MainActivity));
                    break;
            }
        }

我再次使用(案例 1),因为如果我这样做(案例 0),它会不断刷新,因为微调器会停留在我的第一个项目上。这样,如果我两次使用案例 1,我可以在它们之间进行交换,但项目文本不正确。基本上,我点击“Case 1”或“Item 1”,然后进入第二个活动。

【问题讨论】:

  • 使用片段怎么样?
  • StartActivity(new Intent(Activity, typeof(Activity2))); 应该可以工作
  • 片段是什么意思?
  • 我想出了如何让 StartActivity 方法工作,但我主要是在使用条件微调项语句时遇到问题。
  • 您使用具有微调器和片段元素的 axml 进行活动。然后创建 2 个片段活动。选择旋转器的第一个元素时,您将使用片段的视图填充片段元素1.这适合您吗?如果您认为是的,我会发布并回答代码示例。

标签: c# android android-activity xamarin


【解决方案1】:

可以使用以下代码根据微调器选择更改活动:

spinner.ItemSelected += Spinner_ItemSelected;

void Spinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
{
    switch(e.Position)
    {
       case 0:
         StartActivity(...);
         break;
       ...
     }
}

【讨论】:

  • 好的,但是如何将我的选择( item1 和 item2 )用于这两个位置?
  • 我不明白你的目标是什么。选择项目 1(位置 1)或项目 2(位置 2)。我的理解中遗漏了什么?
  • 我的物品和你想的不完全一样。我无法直接打电话给他们。
  • 如果您无法直接调用它们,您将如何确定从微调器调用哪个?
【解决方案2】:

好的,让我们看看: 您的主页将类似于:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true">
    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/spinner"
        android:entries="@array/spinnerItems"/>
    <FrameLayout
        android:id="@+id/spinner_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

然后在您的 MainActivity.cs 中,您将拥有:

    FragmentClass1 Fragment1;
    FragmentClass2 Fragment2;

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        SetContentView (Resource.Layout.detalleVisita);

        Fragment1= new FragmentClass1();
        Fragment2= new FragmentClass2();

        Spinner spinner = this.FindViewById<Spinner>Resource.Id.spinner);
        spinner.ItemSelected += new EventHandler<AdapterView.ItemSelectedEventArgs>(spinner_ItemSelected);
    }
    void spinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
    {
        int selectedSpinn = e.Position;
        if(selectedSpinn ==0)
        {
             //THAT DOES THE CHANGE OF FRAGMENT
             FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
             fragmentTx.Replace(Resource.Id.spinner_fragment, Fragment1);
             fragmentTx.SetTransition (FragmentTransit.FragmentFade);
             fragmentTx.Commit();
        }
        else if(selectedSpinn ==1)
        {
             //THAT DOES THE CHANGE OF FRAGMENT
             FragmentTransaction fragmentTx =  this.FragmentManager.BeginTransaction();
             fragmentTx.Replace(Resource.Id.spinner_fragment, Fragment2);
             fragmentTx.SetTransition (FragmentTransit.FragmentFade);
             fragmentTx.Commit();
        }
    }

在您的 FragmentX.axml 中,您将像往常一样创建一个视图,您的 FragmenX.cs 将如下所示:

 public class FragmentClass1 : Fragment
 {
     public override void OnCreate(Bundle savedInstanceState)
     {
         base.OnCreate(savedInstanceState);
     }
     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
     {
         View view = inflater.Inflate(Resource.Layout.Fragment1, container, false);
         //THIS IS FOR IF YOU NEED ACCESO TO CONTEXT,
         // OR MAINACTIVITY PROPERTIES OR FUNCTIONS
         MainActivity myActivity = (MainActivity )this.Activity;

         return view;
     }

这样,微调器将永远位于顶部,如果您更改微调器的选择,它将显示一个视图,然后您可以再次更改微调器并查看另一个视图。 在我的应用程序中,我使用的是按钮而不是微调器。 希望对你有帮助。

【讨论】:

  • 好的,我设法结合两个答案来做到这一点。但现在的问题是,选择的选项并不总是顶部的默认选项。换句话说,即使我选择第二个选项并使用第二个布局转到第二个活动,微调器仍然停留在第一个选项上。
  • 可以分享spinner itemselected函数的代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多