2017-02-28 8 views
1

私はAlertdialogに何回も膨らませたいレイアウトを持っています。私は膨らんだビューを保持するリストを持っており、Resources/values/Strings.xmlで定義されたリソースからAdapterを作成しました。 これはのstrings.xmlの関連する部分である:C#Visual StudioのXamarin.Android:非常に同じアダプタを使用する複数のスピナー?

<string name="day_prompt">Choose a day</string> 
<string-array name="days_array"> 
    <item>Monday</item> 
    <item>Tuesday</item> 
    <item>Wednesday</item> 
    <item>Thursday</item> 
    <item>Friday</item> 
    <item>Saturday</item> 
    <item>Sunday</item> 
</string-array> 

そしてここではadpterと、リストを作成するために使用するコードです:

//create a list to hold Views 
List<View> chooseElements = new List<View>(); 
//create a new adapter to be fed with data defined in vals/Strings 
var adapter = ArrayAdapter.CreateFromResource(this, Resource.Array.days_array, Android.Resource.Layout.SimpleSpinnerItem); 
//set its source to prev mentioned 
       adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem); 
for (int i = 0; i < numberOfDays; i++) 
    { 
     //creating a custom number of elements 
     SetUpItems(Resource.Id.dayPicker, Resource.Layout.ChoosingDay, alertHolder, adapter, chooseElements); 
    } 

私は内部Spinner要素のidを見つけたいですリスト内の実際の(最新の)ViewGroup要素を削除します。しかし、私の問題は、最初にSpinnerのアダプタを設定できるだけで、他のすべての要素はアダプタが接続されていないように見えます。アダプタ1個の1個のみ要素にしか使用できません。 はここに関連するコードです:

void SetUpItems(int idOfSpinner, int idOfElement, View alertDialogHolder, ArrayAdapter ad, List<View> list) 
    { 
     list.Add(LayoutInflater.Inflate(idOfElement, alertDialogHolder.FindViewById<LinearLayout>(Resource.Id.mainHolder))); 
     #region Spinner 
     Spinner spinner = new Spinner(this); 
     //spinner = alertDialogHolder.FindViewById<Spinner>(idOfSpinner); 
     spinner = list[list.Count - 1].FindViewById<Spinner>(idOfSpinner); 
     spinner.ItemSelected += new EventHandler<AdapterView.ItemSelectedEventArgs>(Spinner_ItemSelected); 
     //var adapter = ArrayAdapter.CreateFromResource(this, Resource.Array.days_array, Android.Resource.Layout.SimpleSpinnerItem); 
     //adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem); 
     spinner.Adapter = ad; 
     #endregion 
    } 

私はXamarinにかなり新しいので、私は本当に同じアダプタで複数のSpinnersを処理する方法がわからない(または、それが実際に可能である場合)。私は無駄に多くのソリューションを試して、私は同じアダプタで複数のSpinnerを処理する上で任意のリソースを見つけることができませんでした。誰かが私にこれに関するアドバイスをくれますか?

+0

を見て、あなたは1つのビュー内のいくつかの 'Spinner'sを持っており、初回のみが正常にアダプタを設定することができ、同じアダプタを持つ他の人は動かないのですか? –

+0

はい、それより少し複雑です:私は_inflation_を通して 'Spinner'要素を作成しますが、私はそれらのすべてのためにアダプタを設定しましたが、最初のものだけがアダプタを持つようです。 – rTECH

答えて

0

誰かが同じ問題を抱えている場合は、解決策を見つけました。非常にきれいではありませんが、機能します。申し訳ありませんが、私は経験豊かな開発者ではありません。

主な問題は、次のコードとされているようだ:

spinner = list[list.Count - 1].FindViewById<Spinner>(idOfSpinner); 

それ自体は問題ではありませんが、同様に他の要素にFindViewByIdで見つかったビューを割り当てたい場合は、あなたのつもり顔問題は、として生成されたすべての要素は同じIDとなります。何らかの理由で、これはエラーとしてカウントされません(警告でさえありません)ので、プログラムは要求されたIDを持つ最初の要素を常にリストから返すことによって問題をコンパイルして解決します。実際には、これは、私のようなプログラムでは、全く同じ最初の要素が何度も何度も再定義され、他の要素は無視されることを意味します。

要素にプログラマチックに新しいIDを割り当てると、この問題は解決できます。私のコードでは、別のアクティビティへの将来のデータ転送のために各要素にアクセスできるようにリストを使用しましたが、新しい一意のIDを割り当てる際の重要な要素であるとは言えません。

list.Add(LayoutInflater.Inflate(idOfElement, alertDialogHolder.FindViewById<LinearLayout>(Resource.Id.mainHolder))); 

//creating a temp list for spinners 
List<Spinner> spinners = new List<Spinner>(); 

//adding a new element 
spinners.Add(new Spinner(this)); 

//capturing the current element, this way, I dont have to re-call it every time 
int currentElement = spinners.Count - 1; 

//assign a new lineear layout from another list 
spinners[currentElement] = list[list.Count - 1].FindViewById<Spinner>(idOfSpinner); 

//IMPORTANT: generate a new UNIQUE id 
spinners[currentElement].Id = View.GenerateViewId(); 

//subscribe to the event 
spinners[currentElement].ItemSelected += new EventHandler<AdapterView.ItemSelectedEventArgs>(Spinner_ItemSelected); 

//set the adapter 
spinners[currentElement].Adapter = ad; 
-1

なぜActionSheetを使用しませんか?このlinkに従うと、探しているものの解決策が得られます。

だからコードサンプル

using Android.Widget; 
using Android.OS; 
using Xamarin.ActionSheet; 
using Android.Support.V4.App; 
using System.Collections.Generic; 
using Android.App; 

namespace ActionSheetTest 
{ 
    [Activity (Label = "ActionSheetTest", MainLauncher = true, Icon = "@mipmap/icon")] 
    public class MainActivity : FragmentActivity,ActionSheet.IActionSheetListener 
    { 
    protected override void OnCreate (Bundle savedInstanceState) 
    { 
     base.OnCreate (savedInstanceState); 

     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.Main); 

     // Get our button from the layout resource, 
     // and attach an event to it 
     Button button = FindViewById<Button> (Resource.Id.myButton); 

     button.Click += delegate { 
      var actionSheet = new ActionSheet(); 
      actionSheet.Other_Button_Title = new List<string>(){ "Option1", "Option2" }; 
      actionSheet.SetActionSheetListener (this); 
      actionSheet.Show (SupportFragmentManager); 
     }; 
    } 

    public void onDismiss (ActionSheet actionSheet, bool isCancel) 
    { 
     System.Console.WriteLine ("onDismiss"); 
    } 

    public void onOtherButtonClick (ActionSheet actionSheet, int index) 
    { 
     System.Console.WriteLine (index); 
    } 
} 
} 
+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿](レビュー/低品質の投稿/ 18029281) – alko

+0

このリンクは質問に答えるかもしれませんが、回答の重要な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 18029281) – phuzi

+0

あなたの提案をありがとうございます。しかし、なぜあなたはdownvoteをしたいですか? –

関連する問題