2017-11-23 21 views
1

Xamarin을 사용하여 선택 항목에 굵게, 밑줄, 기울임 꼴, 색상 (기타) 속성을 추가/제거 할 수있는 자체 맞춤형 텍스트 편집기를 Android에서 사용하고 있습니다. 나는 이러한 속성 중 하나를 설정하는 버튼을 클릭 할 때마다 포커스를 잃어 버리고 소프트 키보드로 솔루션을 찾았습니다. 그러나강제 키보드에 텍스트를 쓸 수 없습니다. Android Xamarin

을 여는 소프트 키보드와 나는 더 많은 텍스트를 나는 EditText에 초점을 강제 경우에도

을 쓸 수 없습니다. 누른 키는 아무 것도하지 않습니다. 여기에 내가 보여 소프트 키보드를 강제로 사용하고 코드입니다 :

_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에 있지만 결과는 같습니다.

편집

나는 안드로이드 Studio와 함께 네이티브 안드로이드에 샘플을 만들어 키보드 내가 놓친 거지 무슨 ... 심지어 InputMethodManager를 사용하지 않고 완벽하게 확인을 작동합니다. Xamarin에 제대로 작동하지 않는 것이 있습니까? 네이티브에서는 xamarin에서 할 수없는 정확한 동작을하기 때문입니다. 그것은 내가 Xamarin.Android의 AppCompat.ViewRenderer 아닌 기본 ViewRenderer을 사용하고 사실에 관련된 것 같다 2

편집 할 수 있습니다. 그것을 테스트하는 도중. 모든 환경과 가능성을 테스트 오랜 시간 후

EDIT 3

, 나는,

코드가 네이티브 응용 프로그램으로하지만, 사용자 정의 렌더러와 동일한 방식으로 작동하는 결론에 도달했습니다

버튼을 클릭하면 이상이어야합니다 (적어도 ~ 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 본 Rich Text Editor를 표시하는 Custom Renderer를 사용하고 있다는 사실이 밝혀졌습니다. Native Xamarin Forms 및 사용자 정의 렌더러가없는 Android 플랫폼 및 Xamarin.Android. Xamarin.forms를 사용하여 CustomRenderer가있는 페이지에서이 뷰를 렌더링하고 있음을 언급하는 것을 잊어 버렸습니다. – EddyW

답변

0

솔루션을 찾았습니다. 장기적인 디자인의 관점에서 볼 때 가장 좋지는 않지만 공장. VisualElementRendererRichTextEditor 클래스로 만들었으며 불필요한 코드를 제거하고 더 중요한 요소를 제거하여 요소의 기본 포커스 동작을 재정의했습니다. 또한 .axml 파일에서 레이아웃을 부 풀리면 프로그래밍 방식으로 뷰를 생성하는 것과는 다른 동작을 일으킬 수 있으므로 C#에서 내 .axml의 간단한 변환을 포함하는 RichTextEditor_Droid 클래스를 만들었습니다. 그리고 내 EditText에있는 FocusChange eventHandler를 삭제했습니다. 나는이보기가 안드로이드에 렌더링 더 이상 AppBar이없는 원인

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); 
     } 
    } 

가 지금은 또 다른 문제가 생겼어요 : 여기 내 렌더러입니다. 그러나 이것은 맥락에서 벗어난 것입니다. 도움을 주신 @ YorkShen-MSFT에게 감사드립니다.