2017-11-23 11 views
1

Xamarinを使用して自分のカスタムリッチテキストエディタを使っています。選択肢に太字、下線、斜体、色などの属性を追加/削除する可能性があります。私はこれらの属性の1つを設定するボタンをクリックするたびにフォーカスを失っていたので、ソフトキーボードで解決策を見つけました。 しかし、私は、私はEditTextにフォーカスを余儀なくされているにもかかわらず、多くのテキスト強制キーボードにテキストを書くことができません。Android Xamarin

を書き込むことはできません

を開き、ソフトキーボードを持ちます。押されたキーは何もしません。 ここで私は示すために、ソフトキーボードを強制的に使用しているコードです:

_myEditText.FocusChange += _MyEditText_OnFocusChanged; 

private void _editor_FocusChange(object sender, FocusChangeEventArgs e) 
{ 
    _myEditText.RequestFocus(); 
    InputMethodManager imm = (InputMethodManager)Context.GetSystemService(Context.InputMethodService); 
    imm.ToggleSoftInput(ShowFlags.Implicit, 0); 

} 

オープンキーボードを維持する方法はありますがとEditTextに新しいテキストを書き込むことができることは、 ?私はShowSoftInput()ShowFlags.Forcedタグで試してみました。さらにShowSoftInputOnFocusのプロパティーは_myEditTextでしたが、結果は同じです。

EDIT

私は私が何をしないのです... AndroidのメーカーとキーボードさえInputMethodManagerを使用せずに完全にOK作品とのネイティブAndroidのサンプルを作りました。 Xamarinに正常に動作しないものがありますか?ネイティブでは、私がxamarinで作ることができない正確な行動をしているからです。

EDIT 2

それは、私は基本的にViewRenderer Xamarin.AndroidのAppCompat.ViewRendererを使用していないよという事実に関連すると思われます。私の方法でそれをテストする。

EDIT 3

あらゆる環境と可能性をテストし、長い時間の後、私はコードはネイティブアプリケーションと同様の作業が、カスタムレンダラであることを結論に来て、

ONLYボタンのクリック数が少なくとも〜0.5秒の長さである場合。

がインスタントクリックをすれば、私は私のEditTextのフォーカスを失って、私は少し長くボタンを押したままにすると、ボタンのアクションが起動され、キーボードが開いたままと選択がで影響を受けますスタイルチェンジメント。

できるだけ簡単に問題を再現するための基本的なコードです。 基本的なフォームアプリを作成するだけです。そして、3次クラスに

マイフォームのカスタムビューを追加します(空)

public class RichTextEditor : View 
{ 

} 

マイアンドロイドレンダラ:

using Android.App; 
using TestFocusApplicationForms.CustomViews; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 

[assembly: ExportRenderer(typeof(RichTextEditor), typeof(TestFocusApplicationForms.Droid.RichTextEditorRenderer_Droid))] 
namespace TestFocusApplicationForms.Droid 
{ 
    public class RichTextEditorRenderer_Droid : Xamarin.Forms.Platform.Android.ViewRenderer<RichTextEditor, Android.Views.View> 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<RichTextEditor> e) 
     { 
      base.OnElementChanged(e); 

      if (e.NewElement == null) 
      { 
       return; 
      } 

      if (Control == null) 
      { 
       Activity activity = this.Context as Activity; 
       var view = activity.LayoutInflater.Inflate(Resource.Layout.TestFocus_Layout, this, false); 
       SetNativeControl(view); 
      } 
     } 
    } 
} 

と対応TestFocus_Layout.axmlファイル:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="0" 
     android:orientation="horizontal" 
     android:layout_gravity="top|end"> 
     <Button 
      android:layout_gravity="end" 
      android:layout_width="44dp" 
      android:layout_height="44dp" 
      android:text="B" 
      android:id="@+id/boldButton" /> 
     <Button 
      android:layout_gravity="end" 
      android:layout_width="44dp" 
      android:layout_height="44dp" 
      android:text="I" 
      android:id="@+id/italicButton" /> 
    </LinearLayout> 
    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:gravity="top" 
     android:hint="Texte riche" 
     android:layout_gravity="bottom" 
     android:id="@+id/myEditText" 
     android:singleLine="false" 
     android:imeOptions="actionNone" /> 
</LinearLayout> 
+0

「EditText」でどのように属性を設定しましたか?この問題を再現するために、より多くのコードを共有してください。 –

+0

@ YorkShen-MSFT私は、EditTextの選択にSetSpan(style、startIndex、endIndex、SpanTypes)メソッドを使用しました。これはうまくいく、これは問題ではない。問題は、新しく開かれたキーボードが動作しないということです。 – EddyW

+0

@ YorkShen-MSFT私は、このリッチテキストエディタを表示しているカスタムレンダラーを使用しているという事実に関連しているようです。これは、ネイティブXamarinフォームとカスタムレンダラを使用しないAndroidプラットフォームとXamarin.Android私はXamarin.formsを使用して、このビューをCustomRendererを使ってPageでレンダリングしています。 – EddyW

答えて

0

私は解決策を見つけましたが、それは長期的な設計の点では最良ではないかもしれませんが、働く 私は自分のVisualElementRendererRichTextEditorクラスとして作成し、不必要なコードと、より重要な、削除されたコードをすべて削除して、要素のデフォルトのフォーカス動作をオーバーライドしました。 また、.axmlファイルからレイアウトを膨らませると、プログラムでビューを作成するときとは異なる動作になるため、C#での.axmlの単純な変換を含むRichTextEditor_Droidクラスを作成しました。私はEditTextFocusChange eventHandlerを削除しました。ここ は私のレンダラです:

public class RichTextEditorRenderer_Droid : 
     Xamarin.Forms.Platform.Android.VisualElementRenderer<RichTextEditor> 
    { 
     public Android.Views.View NativeView { get; private set; } 

     public RichTextEditorRenderer_Droid(Context context) : base(context) 
     { 

     } 

     public RichTextEditorRenderer_Droid() 
     { 

     } 

     protected override void OnElementChanged(
      ElementChangedEventArgs<RichTextEditor> e) 
     { 
      base.OnElementChanged(e); 

      if (e.NewElement == null) 
      { 
       return; 
      } 

      if (NativeView == null) 
      { 
       Xamarin.Forms.Application.Current.On<Xamarin.Forms.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize); 

       var activity = Context as Activity; 
       var textPad = new RichTextEditor_Droid(this.Context); 

       var textPadLayoutParams = new LinearLayout.LayoutParams(
         ViewGroup.LayoutParams.MatchParent, 
         ViewGroup.LayoutParams.MatchParent); 
       activity.SetContentView(textPad, textPadLayoutParams); 

       NativeView = textPad; 
      } 
     } 

     bool _disposed; 
     protected override void Dispose(bool disposing) 
     { 
      if (disposing && !_disposed) 
      { 
       if (NativeView != null && ManageNativeControlLifetime) 
       { 
        RemoveView(NativeView); 
        NativeView.Dispose(); 
        NativeView = null; 
       } 

       _disposed = true; 
      } 

      base.Dispose(disposing); 
     } 
    } 

は今、私は、このビューはAndroid上でレンダリングされるとき、私はこれ以上のアプリケーションバーを持っていない別の問題の原因を持っています。しかし、それは文脈から外れています。ご協力いただいた@ YorkShen-MSFTに感謝いたします。

関連する問題