2

MvxListView とフォームを含むビューがあります。ビューのコードで次のコードを使用してソフトキーボードを非表示にできます (これは純粋なビューの問題であるため)。

var editText = FindViewById<EditText>(Resource.Id.newCheckbookName);
editText.EditorAction += (object sender, TextView.EditorActionEventArgs e) =>
    {
        if (e.ActionId == ImeAction.Done)
        {
            InputMethodManager inputMgr = GetSystemService(InputMethodService) as InputMethodManager;
            inputMgr.HideSoftInputFromWindow(CurrentFocus.WindowToken, 0);
        }
        return;
   };

私のアイテム テンプレートには、別のテキスト エディターがあり、同じ動作をしたいと考えています。しかし、 MwxItemTemplate のビュー コードがないので、どこにコードを追加できますか?

4

1 に答える 1

2

これを行う簡単な方法は、リスト項目内でカスタムの「ビュー」を使用することだと思います。

: ここでの「ビュー」は、Model-View-ViewModel ビューではなく Android ビューを指します。名前が混乱して申し訳ありません。

カスタム ビューの作成は簡単です...

カスタムビューを作成するだけです-例

namespace Angevelle.App1.UI.Droid.Controls
{
    public class MyText : EditText
    {
        public MyText(Context context, IAttributeSet attrs)
            : base(context, attrs)
        {
            this.EditorAction += OnEditorAction;
        }

        private void OnEditorAction(object sender, EditorActionEventArgs editorActionEventArgs)
        {
            if (editorActionEventArgs.ActionId == ImeAction.Done)
            {
                // this code not tested - but something like this should work
                var imm = (InputMethodManager)Context.GetSystemService(Context.InputMethodService);
                imm.HideSoftInputFromWindow(WindowToken, 0);
            }
        }
    }
}

その後、Android や Mvx のビューと同じように、そのビューを AXML で使用できます。

<angevelle.app1.ui.droid.controls.MyText
         android:layout_height=....
     />

angevelle.app1.ui.droid.controls冗長すぎる場合は、setup.cs で省略形を使用してこれを短くすることができます。

    protected override IDictionary<string, string> ViewNamespaceAbbreviations
    {
        get
        {
            var abbreviations = base.ViewNamespaceAbbreviations;
            abbreviations["Abv"] = "angevelle.app1.ui.droid.controls";
            return abbreviations;
        }
    }

次に、次を使用できます。

<Abv.MyText
         android:layout_height=....
     />

別のアプローチは、何らかの方法でリストをカスタマイズすることです...

リストビューとそのアダプターを完全にカスタマイズする必要がある場合は、UI プロジェクトの MvxBindableListView から継承する同じ種類の手法を使用して簡単に行うことができます。

public class MyListView : MvxBindableListView
{
        public MyListView(Context context, IAttributeSet attrs);
            : base(context, attrs, new MyListAdapter(context))
        {
        }
}

ここで、MyListAdapter はビューの作成をオーバーライドします。

public class MyListAdapter : MvxBindableListAdapter
{
    public MyListAdapter(Context context)
        : base(context)
    {
    }

    // put your custom Adapter code here... e.g.:
    protected override MvxBindableListItemView CreateBindableView(object source, int templateId)
    {
        return new MySpecialListItemView(_context, _bindingActivity, templateId, source);
    }
}

ここで、MySpecialListItemView は MvxBindableListItemView から継承しますが、独自のカスタム機能を追加します。

このアプローチを使用すると、リストは次のように変更されます。

<Mvx.MvxBindableListView
      ....
     />

に:

<Abv.MyListView
      ....
     />

カスタム ビューのその他の例については、GitHub を参照してください。たとえば、https://github.com/Cheesebaronの Calendar、ColorPicker、ActionBar プロジェクトの一部を参照してください。

カスタム コントロールが xamarin デザイナーでレンダリングされることを期待しないでください (まあ、まだ...)


最後に 2 つのメモ...

  1. コードを再利用するには...そのHideSoftInputFromWindow機能を何らかの方法で拡張メソッドに配置して、呼び出すことができるようにすることができますanyEditText.HideOnDone()

  2. Views/UIViews で Monodroid/monotouch イベントを使用する場合は注意してください。これらのイベントは、ネイティブのデリゲート/リスナーを使用する傾向があります。一般に、ネイティブ リスナー/デリゲート ハンドラーと同時に C# イベント サブスクリプションを混在させたり一致させたりしない限り、問題はありません。

于 2012-10-17T13:32:20.490 に答える