1

4 つのフラグメント/パネルを保持する ViewPager があり、それぞれ横長の画面の半分の幅です。

 _______________ _______________ _______________ _______________
|1              |2              |3              |4              |
|               |               |               |               |
|               |               |  ___________  |  ___________  |
|               |               | | EditText1 | | | EditText2 | |
|               |               | |___________| | |___________| |
|_______________|_______________|_______________|_______________|

パネル 3 と 4 には、それぞれ 1 つの EditText があります。

プログラムの開始時に、ユーザーは画面 2 と 3 を表示します (画面 1 を表示するにはスワイプして戻すことができます。画面 4 は、3 のリスト項目が選択されるまでまだ存在しません)。

そのため、パネル (および関連する ViewPager) をホストするビューは、

viewPager.SetCurrentItem(PANEL3,true);   // const int PANEL3 = 2;  - zero offset

これにより、2 と 3 が表示され、3 にフォーカスが与えられます (EditText1 にフォーカスが与えられます)。

ユーザーが 3 で何かを選択して 4 をスライドインさせると (3 と 4 が表示されるようになります)、ホスト ビューで別の呼び出しが行われます。

viewPager.SetCurrentItem(PANEL4,true);    // const int PANEL4 = 3;  - zero offset

これで、パネル 4 がフォーカスを取得します (これにより、EditText2 にフォーカスが与えられます)。


問題は次のとおりです。

EditText2 にフォーカスがあるパネル 3 と 4 で、EditText1 をクリックすると、ソフトキーボードがポップアップし、フォーカスが EditText2 に戻ります (カーソルは EditText2 にあり、任意の入力が入力されます)。

フォーカスが EditText2 に戻る原因を知る必要があります。

viewPager.SetContentView(PANEL4) の呼び出しにより、パネルのフォーカス状態が ViewPager のどこかに保持され、ソフトキーボードがポップアップしていくつかの「更新」イベントが発生すると、ViewPager はそのフォーカスを復元していると推測しています。状態 (これは PANEL4) ですが、確かではありません。ホストビューと各パネル内で多くの印刷物を作成しましたが、ソフトキーボードポップアップによって標準のライフタイムイベントが発生することはありませんが、viewPager の OnLayout が発生することはわかっています。


どんな助けや洞察も大歓迎です、ありがとう。


チーズバロン:

これは、私のソリューションのビューの 1 つが関連するレイアウト ファイル内の ViewGroup (LinearLayout) にラップされていない場合に発生するインフレーションの問題を説明するのに役立つサポート情報です。

PagedFragmentRecordNoteBoxInputが LinearLayout でラップされていない場合、

<?xml version="1.0" encoding="utf-8"?>
<FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox.PagedFragmentRecordNoteBoxInput
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fi_record_note_box_input"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFFFF"
    android:gravity="top"
    android:textSize="20sp"
    android:textColor="#FF000000"
    android:layout_margin="20dip"/>

PagedFragmentRecordNoteBoxのインフレーション コードは次のように変更されます。

protected override RecordNoteBoxInput InstantiateInput()
{
    View v = _inflater.Inflate(Resource.Layout.PagedFragmentRecordNoteBoxInput, null);

    _pagedFragmentFieldInput = (PagedFragmentRecordNoteBoxInput) v;

    _pagedFragmentFieldInput.OuterClass = this;

    return (RecordNoteBoxInput)_pagedFragmentFieldInput;
}

次に、例外が発生します。

07-02 16:21:32.494: I/MonoDroid(18642): UNHANDLED EXCEPTION: Android.Views.InflateException: Exception of type 'Android.Views.InflateException' was thrown.
07-02 16:21:32.494: I/MonoDroid(18642): at Android.Runtime.JNIEnv.CallObjectMethod (intptr,intptr,Android.Runtime.JValue[]) <0x00080>
07-02 16:21:32.494: I/MonoDroid(18642): at Android.Views.LayoutInflater.Inflate (int,Android.Views.ViewGroup) <0x0018f>
07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox.InstantiateInput () <0x0002b>
07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox.Init (Android.Content.Context) <0x00063>
07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet) <0x0002f>
07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet) <0x00023>
07-02 16:21:32.494: I/MonoDroid(18642): at (wrapper dynamic-method) object.705e129e-2c0d-42db-87f7-db1842b85d7c (intptr,object[]) <0x0005f>
07-02 16:21:32.494: I/MonoDroid(18642): at Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,intptr,intptr) <0x000f7>
07-02 16:21:32.494: I/MonoDroid(18642): at (wrapper native-to-managed) Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,intptr,intptr) <0x0006f>
07-02 16:21:32.494: I/MonoDroid(18642): at (wrapper delegate-invoke) <Module>.invoke_intptr__this___intptr_intptr_intptr_JValue[] (intptr,intptr,intptr,Android.Runtime.JValue[]) <0x000ab>
07-02 16:21:32.494: I/MonoDroid(18642): at Android.Runtime.JNIEnv.CallObjectMethod (intptr,intptr,Android.Runtime.JValue[]) <0x00053>
07-02 16:21:32.494: I/MonoDroid(18642): at Android.Views.LayoutInflater.Inflate (int,Android.Views.ViewGroup,bool) <0x001f3>
07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.ParcelRecordDetailInspectionView.Render () <0x0002f>
07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.ParcelRecordDetailInspectionView.OnCreateView (Android.Views.LayoutInflater,Android.Views.ViewGroup,Android.OS.Bundle) <0x000af>
07-02 16:21:32.494: I/MonoDroid(18642): at Android.App.Fragment.n_OnCreateView_Landroid_view_LayoutInflater_Landroid_view_ViewGroup_Landroid_os_Bundle_ (intptr,intptr,intptr,intptr,intptr) <0x0009f>
07-02 16:21:32.494: I/MonoDroid(18642): at (wrapper dynamic-method) object.5d994140-166d-44ce-ac16-71f1e1698262 (intptr,intptr,intptr,intptr,intptr) <0x0005b>
07-02 16:21:32.494: I/MonoDroid(18642):   --- End of managed exception stack trace ---
07-02 16:21:32.494: I/MonoDroid(18642): android.view.InflateException: Binary XML file line #5: Error inflating class FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox.PagedFragmentRecordNoteBoxInput
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
07-02 16:21:32.494: I/MonoDroid(18642):     at mono.android.TypeManager.n_activate(Native Method)
07-02 16:21:32.494: I/MonoDroid(18642):     at mono.android.TypeManager.Activate(TypeManager.java:7)
07-02 16:21:32.494: I/MonoDroid(18642):     at fieldinspection.droid.views.custom.PagedFragmentRecordNoteBox.<init>(PagedFragmentRecordNoteBox.java:29)
07-02 16:21:32.494: I/MonoDroid(18642):     at java.lang.reflect.Constructor.constructNative(Native Method)
07-02 16:21:32.494: I/MonoDroid(18642):     at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.createView(LayoutInflater.java:586)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.parseInclude(LayoutInflater.java:800)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:729)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-02 16:21:32.494: I/MonoDroid(18642):     at fieldinspection.droid.views.ParcelRecordDetailInspectionView.n_onCreateView(Native Method)
07-02 16:21:32.494: I/MonoDroid(18642):     at fieldinspection.droid.views.ParcelRecordDetailInspectionView.onCreateView(ParcelRecordDetailInspectionView.java:52)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:828)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.app.BackStackRecord.run(BackStackRecord.java:622)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:437)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.support.v13.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:167)
07-02 16:21:32.494: I/MonoDroid(18642):     at android.supp
07-02 16:21:32.504: E/mono(18642): Unhandled Exception:
07-02 16:21:32.504: E/mono(18642): Android.Views.InflateException: Exception of type 'Android.Views.InflateException' was thrown.
07-02 16:21:32.504: E/mono(18642): at Android.Runtime.JNIEnv.CallObjectMethod (intptr,intptr,Android.Runtime.JValue[]) <0x00080>
07-02 16:21:32.504: E/mono(18642): at Android.Views.LayoutInflater.Inflate (int,Android.Views.ViewGroup) <0x0018f>
07-02 16:21:32.504: E/mono(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox.InstantiateInput () <0x0002b>
07-02 16:21:32.504: E/mono(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox.Init (Android.Content.Context) <0x00063>
07-02 16:21:32.504: E/mono(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet) <0x0002f>
07-02 16:21:32.504: E/mono(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet) <0x00023>
07-02 16:21:32.504: E/mono(18642): at (wrapper dynamic-method) object.705e129e-2c0d-42db-87f7-db1842b85d7c (intptr,object[]) <0x0005f>
07-02 16:21:32.504: E/mono(18642): at Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,intptr,intptr) <0x000f7>
07-02 16:21:32.504: E/mono(18642): at (wrapper native-to-managed) Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,
07-02 16:21:32.504: I/mono(18642): [ERROR] FATAL UNHANDLED EXCEPTION: Android.Views.InflateException: Exception of type 'Android.Views.InflateException' was thrown.
07-02 16:21:32.504: I/mono(18642): at Android.Runtime.JNIEnv.CallObjectMethod (intptr,intptr,Android.Runtime.JValue[]) <0x00080>
07-02 16:21:32.504: I/mono(18642): at Android.Views.LayoutInflater.Inflate (int,Android.Views.ViewGroup) <0x0018f>
07-02 16:21:32.504: I/mono(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox.InstantiateInput () <0x0002b>
07-02 16:21:32.504: I/mono(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox.Init (Android.Content.Context) <0x00063>
07-02 16:21:32.504: I/mono(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet) <0x0002f>
07-02 16:21:32.504: I/mono(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet) <0x00023>
07-02 16:21:32.504: I/mono(18642): at (wrapper dynamic-method) object.705e129e-2c0d-42db-87f7-db1842b85d7c (intptr,object[]) <0x0005f>
07-02 16:21:32.504: I/mono(18642): at Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,intptr,intptr) <0x000f7>
07-02 16:21:32.504: I/mono(18642): at (wrapper native-to-managed) Java.Interop.TypeManager.n_Activate (intptr,intptr,i
07-02 16:21:32.524: W/InputDispatcher(215): channel '41b69d78 net.monocross.fieldinspection/fieldinspection.droid.FieldInspectionMain (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
07-02 16:21:32.524: E/InputDispatcher(215): channel '41b69d78 net.monocross.fieldinspection/fieldinspection.droid.FieldInspectionMain (server)' ~ Channel is unrecoverably broken and will be disposed!
07-02 16:21:32.524: W/InputDispatcher(215): Attempted to unregister already unregistered input channel '41b69d78 net.monocross.fieldinspection/fieldinspection.droid.FieldInspectionMain (server)'
07-02 16:21:32.524: D/Zygote(116): Process 18642 exited cleanly (1)
07-02 16:21:32.524: W/InputDispatcher(215): channel '41aef860 net.monocross.fieldinspection/fieldinspection.droid.views.CalendarView (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
07-02 16:21:32.524: E/InputDispatcher(215): channel '41aef860 net.monocross.fieldinspection/fieldinspection.droid.views.CalendarView (server)' ~ Channel is unrecoverably broken and will be disposed!
07-02 16:21:32.524: W/InputDispatcher(215): Attempted to unregister already unregistered input channel '41aef860 net.monocross.fieldinspection/fieldinspection.droid.views.CalendarView (server)'
07-02 16:21:32.524: I/ActivityManager(215): Process net.monocross.fieldinspection (pid 18642) has died.
4

2 に答える 2

0

私が見つけた解決策は些細なことではありませんでしたが、それで十分であり、オーバーヘッドもそれほど大きくありません。

Android のデフォルトの動作は、最も子のビュー (この場合は EditText) にタッチ/クリック イベントを与えることであるため、EditText をサブクラス化し、その OnTouchEvent メンバーをオーバーライドする必要がありました。

この場合の委任では不十分です

myEditText.Touch += EditTextTouchEventHandler;

EditText(組み込み)のタッチイベント(テキストボックスの先頭だけでなく、ユーザーが触れた場所にカーソルを配置するなど、いくつかの優れた動作を行う)のデフォルトの動作が引き続き必要だったためです。

OnTouchEvent では、この EditText が存在するフラグメントを保持していたビューページャーにこのクリック イベントが通知され、EditText のフォーカスは手動で処理されます(したがって、更新が発生すると (つまり、キーボードのポップアップが発生すると)、RequestFocus が発生します)。 、最後にクリックされた EditText はフォーカスを失うことはありません (期待どおり)。通信は、Android が推奨するフラグメント「コールバック」のペアレント リスナー パターンを介して行われました。

また、ViewPager の RequestChildFocus メソッドをオーバーライドして、イベントをインターセプトして食べられるようにする必要があります。その代わりに、2 番目の RequestChildFocus2 メソッドが手動で呼び出され、次に基本クラス RequestChildFocus が呼び出されます。

インターフェースを定義および実装する ViewPager を含む Activity

public interface IFragmentToViewPagerEvent
{
    void ParcelRecordFieldClickEvent(Fragment child, View focused);
}

そして、各フラグメントは、このインターフェイスにキャストされたアクティビティへの参照を保持するため、フラグメントは、インターフェイス メソッドを介して ViewPager と通信できます (別のインターフェイスは、Fragments が実装することを宣言できるため、ViewPager はフラグメントを呼び出すことができます。その後、双方向の通信が可能になります)。カバーされている)。

private ParcelView.IFragmentToViewPagerEvent _fragmentToViewPagerEvent;

public override void OnAttach(Activity activity)
{
    base.OnAttach(activity);

    _fragmentToViewPagerEvent = (ParcelView.IFragmentToViewPagerEvent) activity;
}

サブクラスは次のようになります。

RecordNoteBoxInput は、タブに配置される EditText として作成されたカスタム クラスであり、それを含むタブを埋めるように展開され、全体に均一な幅のボーダーがありました。

public class RecordNoteBoxInput : EditText
{
    // sometime u need this, other times you don't - mono's missing nuts that android don't
    //public RecordNoteBoxInput(IntPtr jRef, JniHandleOwnership handle) : base(jRef, handle) { }

    public RecordNoteBoxInput(Context context) : base(context) { }
    public RecordNoteBoxInput(Context context, IAttributeSet attributes) : base(context, attributes) { }
    public RecordNoteBoxInput(Context context, IAttributeSet attributes, int defStyle) : base(context, attributes, defStyle) { }
}

public class RecordNoteBox : LinearLayout
{
    protected Context _context;
    protected LayoutInflater _inflater;

    protected RecordNoteBoxInput _inputFiled;

    public RecordNoteBoxInput Input
    {
        get { return _inputFiled; }
        set { _inputFiled = value; }
    }

    protected virtual RecordNoteBoxInput InstantiateInput()
    {
        return (RecordNoteBoxInput)_inflater.Inflate(Resource.Layout.RecordNoteBoxInput, this, false);
    }

    protected void Init(Context context)
    {
        _context = context;
        _inflater = LayoutInflater.From(context);
        _inputFiled = InstantiateInput(); 

        this.AddView(_inputFiled);
    }

    // sometime u need this, other times you don't - mono's missing nuts that android don't
    //public RecordNoteBox(IntPtr jRef, JniHandleOwnership handle) : base(jRef, handle) { }

    public RecordNoteBox(Context context) : base(context) { Init(context); }
    public RecordNoteBox(Context context, IAttributeSet attributes) : base(context, attributes) { Init(context); }
    public RecordNoteBox(Context context, IAttributeSet attributes, int defStyle) : base(context, attributes, defStyle) { Init(context); }

}

PagedFragmentRecordNoteBox は、RecordNoteBox 内で構成された EditText の OnTouchEvent をオーバーライドできるように作成されました。これにより、EditText がフォーカスされていない ViewPager に信号を送る機会が与えられます。SetCurrentItem() は使用できません。ハーフスクリーンの ViewPager ページを使用しているため (ViewPagerAdapter の PageWidth に対して 0.5f を返す)、現在右側にあるページは、SetCurrentItem の呼び出し時に自動的に左にシフトされます。 、これは ViewPager のデフォルトの動作であり、この関数を書き直す気がなかったからです。また、ViewPager クラス全体を書き直さないと制御できない、この関数の内部/プライベート バージョンがあります。

public class PagedFragmentRecordNoteBox : RecordNoteBox
{
    public Fragment ParentFragment { get; set; }
    public RecordView.IFragmentToViewPagerEvent PagerListener { get; set; }

    private PagedFragmentRecordNoteBoxInput _pagedFragmentFieldInput;

    // sometime u need this, other times you don't - mono's missing nuts that android don't
    //public PagedFragmentRecordNoteBox(IntPtr jRef, JniHandleOwnership handle) : base(jRef, handle) { }

    public PagedFragmentRecordNoteBox(Context context) : base(context) { }
    public PagedFragmentRecordNoteBox(Context context, IAttributeSet attributes) : base(context, attributes) { }
    public PagedFragmentRecordNoteBox(Context context, IAttributeSet attributes, int defStyle) : base(context, attributes, defStyle) { }

    protected override RecordNoteBoxInput InstantiateInput()
    {
        // Since I was getting inflation exception when the layout file 
        // PagedFragmentRecordRecordNoteBoxInput.axml had only a single, not wrapped in any ViewGroup, I had to 
        // wrap it up in a linear layout (whatever). Since this view will be added somewhere else, it needs to 
        // be removed from the wrapper (hence the call to RemoveAllViews - comment it out to see what happens).

        //LayoutInflater inflater = (LayoutInflater)_context.ApplicationContext.GetSystemService(Context.LayoutInflaterService);
        View v = _inflater.Inflate(Resource.Layout.PagedFragmentRecordRecordNoteBoxInput, null);

        _pagedFragmentFieldInput = ((ViewGroup)v).FindViewById<PagedFragmentRecordNoteBoxInput>(Resource.Id.fi_record_note_box_input);

        ((ViewGroup)v).RemoveAllViews();

        _pagedFragmentFieldInput.OuterClass = this;

        return (RecordNoteBoxInput)_pagedFragmentFieldInput;
    }

    protected class PagedFragmentRecordNoteBoxInput : RecordNoteBoxInput
    {
        public PagedFragmentRecordNoteBox OuterClass { get; set; }

        private Context _context { get; set; }

        // sometime u need this, other times you don't - mono's missing nuts that android don't
        //public PagedFragmentRecordNoteBoxInput(IntPtr jRef, JniHandleOwnership handle) : base(jRef, handle) { }

        public PagedFragmentRecordNoteBoxInput(Context context) : base(context) { _context = context; }
        public PagedFragmentRecordNoteBoxInput(Context context, IAttributeSet attributes) : base(context, attributes) { _context = context; }
        public PagedFragmentRecordNoteBoxInput(Context context, IAttributeSet attributes, int defStyle) : base(context, attributes, defStyle) { _context = context; }

        public override bool OnTouchEvent(MotionEvent e)
        {
            OuterClass.PagerListener.ParcelRecordFieldClickEvent(OuterClass.ParentFragment, this);

            return base.OnTouchEvent(e);
        }
    }
}

次に、EditText を持つフラグメントの OnCreateView で、次のように EditText (またはそのサブクラス) を設定します。

_thisView = (ViewGroup) _inflater.Inflate(Resource.Layout.Record, _container, false);

PagedFragmentRecordNoteBox userNotes = _thisView.FindViewById<PagedFragmentRecordNoteBox>(Resource.Id.ll_record_note_box);

PagedFragmentRecordNoteBox userNotes.ParentFragment = this;
PagedFragmentRecordNoteBox userNotes.PagerListener = _fragmentToViewPagerEvent;

ViewPager をホストするメイン アクティビティは次のようになります。

public class ParcelView : Activity
{
    protected ViewPager _viewPager;
    private List<Android.App.Fragment> _fragments;

    public interface IFragmentToViewPagerEvent
    {
        void ParcelRecordFieldClickEvent(Fragment child, View focused);
    }

    void IFragmentToViewPagerEvent.ParcelRecordFieldClickEvent(Fragment child, View focused)
    {
        _viewPager.RequestChildFocus2(null, focused);
    }   
}

最後に必要な作業は、ViewPager の RequestChildFocus() メソッドをオーバーライドして、リクエストを処理することです。

public class ViewPager2 : ViewPager
{
    private view _clearFocused;

    public override void RequestChildFocus(View child, View focused)
    {
        //base.RequestChildFocus(child, focused);
    }

    public void RequestChildFocus2(View child, View focused)
    {            
        if( _clearFocused != null )
        {
            _clearFocused.ClearFocus();
        }

        _clearFocused = focused;

        base.RequestChildFocus(child, focused);
    }

}

レイアウトファイルは次のように定義されています

Fragment.axml (フラグメントのメイン レイアウトの 1 つ):

  ...
  <TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/ll_record_detail_tab"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:orientation="vertical"
      android:background="#FF200000">

      <FieldInspection.Droid.Views.MyTabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

      <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        ...

        <include layout="@layout/RecordNoteBox"/>

        ...

      </FrameLayout>

    </LinearLayout>

  </TabHost>
  ...

RecordNoteBox.axml

<?xml version="1.0" encoding="utf-8"?>
<!--fieldinspection.droid.views.custom.RecordNoteBox-->
<fieldinspection.droid.views.custom.PagedFragmentRecordNoteBox
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/ll_record_note_box"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#FF555555">

</fieldinspection.droid.views.custom.PagedFragmentRecordNoteBox>

RecordNotBoxInput.axml

<?xml version="1.0" encoding="utf-8"?>
<fieldinspection.droid.views.custom.FieldInput
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/fi_record_note_box_input"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#FFFFFFFF"
  android:gravity="top"
  android:textSize="20sp"
  android:textColor="#FF000000"
  android:layout_margin="20dip"/> 

PagedFragmentRecordNoteBoxInput.axml - LinearLayout にラップされていることに注意してください。これは、インフレ例外を回避するためでした。一部のビューをインフレートするために ViewGroup でラップする必要がある理由はまだわかりませんが、そうです (さらに奇妙なのは、ViewGroup が View のサブクラスであるため、理解できます)。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/ll_record_note_box_input_container"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">

  <FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox.PagedFragmentRecordNoteBoxInput
    android:id="@+id/fi_record_note_box_input"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFFFF"
    android:gravity="top"
    android:textSize="20sp"
    android:textColor="#FF000000"
    android:layout_margin="20dip"/>

  </LinearLayout>
于 2013-07-01T21:05:19.180 に答える
0

私の答えは、上記の EditText サブクラス EditText2 の OnFocusChange() オーバーライドからのこのスタック トレース内にあります (これをトレースするのに良い時間です)。

注:これはアーカイブのみを目的としており、この問題について将来の読者に役立つ可能性があります。私はこれを私の答えとして受け入れず、まだ助けを求めています(ありがとうございます)。


dalvik.system.VMStack.getThreadStackTrace(ネイティブ メソッド) java.lang.Thread.getStackTrace(Thread.java:591) appname.droid.views.EditText2.n_onFocusChanged(ネイティブ メソッド) appname.droid.views.EditText2.onFocusChanged(EditText2. java:53) android.view.View.handleFocusGainInternal(View.java:3680) android.view.View.requestFocus(View.java:5373) android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:2154) android.view. ViewGroup.requestFocus(ViewGroup.java:2110) android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:2154) android.view.ViewGroup.requestFocus(ViewGroup.java:2110) android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java: 2154) android.view.ViewGroup.requestFocus(ViewGroup.java:2110) android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:2154) android.view.ViewGroup.requestFocus(ViewGroup.java:2113) android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:2154) android.view.ViewGroup.requestFocus(ViewGroup.java:2110) android.view.View.requestFocus(View.java:5323) android.support.v4.view.ViewPager.populate(ViewPager.java:1051) android.support.v4.view.ViewPager.populate(ViewPager.java:881) android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1366) android.view.View.measure(View.java:12728) android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) android.widget.LinearLayout.measureVertical(LinearLayout.java:660) android.widget.LinearLayout.onMeasure( LinearLayout.java:553) android.view.View.measure(View.java:12728) android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) android.widget.FrameLayout.onMeasure(FrameLayout.java:293) android. view.View.measure(View.java:12728) android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) android.widget.LinearLayout.measureVertical(LinearLayout.java:660) android.widget.LinearLayout.onMeasure(LinearLayout.java:553) android.view.View.measure(View.java:12728) android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) android.widget.FrameLayout.onMeasure(FrameLayout.java:293) com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092) android.view.View.measure(View.java:12728) android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064) android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) android.os.Handler.dispatchMessage(Handler.java:99) android.os.Looper.loop( Looper.java:137) android.app.ActivityThread.main(ActivityThread.java:4424) java.lang.reflect.Method.invokeNative(ネイティブ メソッド) java.lang.reflect.Method.invoke(Method.java:511) com .android.internal.os.ZygoteInit$MethodAndArgsCaller.実行 (ZygoteInit.java:784) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:551) dalvik.system.NativeStart.main (ネイティブ メソッド)

public class ViewPager extends ViewGroup 
{
    ...

    void populate 
    {
        ...

        if (hasFocus()) {
            View currentFocused = findFocus();
            ItemInfo ii = currentFocused != null ? infoForAnyChild(currentFocused) : null;
            if (ii == null || ii.position != mCurItem) {
                for (int i=0; i<getChildCount(); i++) {
                View child = getChildAt(i);
                ii = infoForChild(child);
                if (ii != null && ii.position == mCurItem) {
                    if (child.requestFocus(FOCUS_FORWARD)) {
                        break;
                    }
                }
            }
        }

        ...
    }

    ...
}
于 2013-03-01T17:46:50.547 に答える