ViewPager焦点问题

我有一个ViewPager,它包含4个片段/面板,每个半宽度都是一个景观屏幕。

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

面板3和4每个都有一个EditText。

在程序开始时,用户显示屏幕2和3(他们可以向后滑动以查看屏幕1,并且在选择3上的列表项之前屏幕4尚不存在)。

因此,托管面板(和相关的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成为焦点)。


这是问题:

使用面板3和4显示EditText2具有焦点的位置,如果我然后单击进入EditText1,这将导致软键盘弹出,焦点将恢复为EditText2(光标位于EditText2中,并且任何输入都会输入到其中)。

我需要知道是什么导致焦点恢复到EditText2。

我推测对viewPager.SetContentView(PANEL4)的调用导致面板焦点状态保留在某个ViewPager中,当软键盘弹出并导致一些“刷新”事件触发时,ViewPager正在恢复该焦点国家(这是PANEL4),虽然我不确定。 我在主机视图和每个面板中制作了大量的打印输出,并且软键盘弹出不会导致任何标准的生命周期事件被触发,但我确实知道viewPager的OnLayout会触发。


欢迎任何帮助或见解,谢谢。


Cheesebaron:

这是支持性信息,有助于说明如果我的解决方案中的某个视图未包含在其关联布局文件中的ViewGroup(LinearLayout)中,则会出现通胀问题。

如果PagedFragmentRecordNoteBoxInput没有包含在LinearLayout中,我们有

   

PagedFragmentRecordNoteBox中的通胀代码更改为

 protected override RecordNoteBoxInput InstantiateInput() { View v = _inflater.Inflate(Resource.Layout.PagedFragmentRecordNoteBoxInput, null); _pagedFragmentFieldInput = (PagedFragmentRecordNoteBoxInput) v; _pagedFragmentFieldInput.OuterClass = this; return (RecordNoteBoxInput)_pagedFragmentFieldInput; } 

然后产生exception:

 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[])  07-02 16:21:32.494: I/MonoDroid(18642): at Android.Views.LayoutInflater.Inflate (int,Android.Views.ViewGroup)  07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox.InstantiateInput ()  07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox.Init (Android.Content.Context)  07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet)  07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet)  07-02 16:21:32.494: I/MonoDroid(18642): at (wrapper dynamic-method) object.705e129e-2c0d-42db-87f7-db1842b85d7c (intptr,object[])  07-02 16:21:32.494: I/MonoDroid(18642): at Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,intptr,intptr)  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)  07-02 16:21:32.494: I/MonoDroid(18642): at (wrapper delegate-invoke) .invoke_intptr__this___intptr_intptr_intptr_JValue[] (intptr,intptr,intptr,Android.Runtime.JValue[])  07-02 16:21:32.494: I/MonoDroid(18642): at Android.Runtime.JNIEnv.CallObjectMethod (intptr,intptr,Android.Runtime.JValue[])  07-02 16:21:32.494: I/MonoDroid(18642): at Android.Views.LayoutInflater.Inflate (int,Android.Views.ViewGroup,bool)  07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.ParcelRecordDetailInspectionView.Render ()  07-02 16:21:32.494: I/MonoDroid(18642): at FieldInspection.Droid.Views.ParcelRecordDetailInspectionView.OnCreateView (Android.Views.LayoutInflater,Android.Views.ViewGroup,Android.OS.Bundle)  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)  07-02 16:21:32.494: I/MonoDroid(18642): at (wrapper dynamic-method) object.5d994140-166d-44ce-ac16-71f1e1698262 (intptr,intptr,intptr,intptr,intptr)  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.(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[])  07-02 16:21:32.504: E/mono(18642): at Android.Views.LayoutInflater.Inflate (int,Android.Views.ViewGroup)  07-02 16:21:32.504: E/mono(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox.InstantiateInput ()  07-02 16:21:32.504: E/mono(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox.Init (Android.Content.Context)  07-02 16:21:32.504: E/mono(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet)  07-02 16:21:32.504: E/mono(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet)  07-02 16:21:32.504: E/mono(18642): at (wrapper dynamic-method) object.705e129e-2c0d-42db-87f7-db1842b85d7c (intptr,object[])  07-02 16:21:32.504: E/mono(18642): at Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,intptr,intptr)  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[])  07-02 16:21:32.504: I/mono(18642): at Android.Views.LayoutInflater.Inflate (int,Android.Views.ViewGroup)  07-02 16:21:32.504: I/mono(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox.InstantiateInput ()  07-02 16:21:32.504: I/mono(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox.Init (Android.Content.Context)  07-02 16:21:32.504: I/mono(18642): at FieldInspection.Droid.Views.Custom.RecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet)  07-02 16:21:32.504: I/mono(18642): at FieldInspection.Droid.Views.Custom.PagedFragmentRecordNoteBox..ctor (Android.Content.Context,Android.Util.IAttributeSet)  07-02 16:21:32.504: I/mono(18642): at (wrapper dynamic-method) object.705e129e-2c0d-42db-87f7-db1842b85d7c (intptr,object[])  07-02 16:21:32.504: I/mono(18642): at Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,intptr,intptr)  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. 

我的答案在于这个堆栈跟踪,它来自上面提到的EditText子类EditText2的OnFocusChange()重写(跟踪它的好时间):

注意:这仅用于存档目的,可能有助于解决此问题的任何未来读者。 我不会接受这个作为我的答案,我仍然愿意接受帮助(再次感谢)。


dalvik.system.VMStack.getThreadStackTrace(Native Method)java.lang.Thread.getStackTrace(Thread.java:591)appname.droid.views.EditText2.n_onFocusChanged(Native Method)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.r equestFocus(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(L inearLayout.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(Native Method)java.lang.reflect.Method.invoke(Method.java:511)com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java :784)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)dalvik.system.NativeStart.main(Native Method)

 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 

我发现的解决方案并非琐碎,但它足以满足要求,并且不会产生过多的开销。

因为Android的默认行为是给孩子最多的视图提供触摸/点击事件,在这种情况下,EditText,我必须子类化EditText并覆盖他们的OnTouchEvent成员。

在这种情况下,代表团是不够的

 myEditText.Touch += EditTextTouchEventHandler; 

因为我仍然想要EditText(内置)触摸事件的默认行为(它做了一些很好的事情,例如将光标定位在用户触摸的位置,而不仅仅是文本框的开头)。

在OnTouchEvent中,持有此EditText所驻留的片段的view-pager被通知此click事件,并且EditText聚焦是手动处理的 (因此当任何刷新发生时 – 即键盘弹出 – 因此RequestFocus触发,最后点击的EditText不会失去焦点(如所示)。通过Android推荐的父级监听模式进行通信,即片段“回调”,即

此外,必须覆盖ViewPager的RequestChildFocus方法,以便拦截和吃掉事件。 取而代之的是,手动调用辅助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,从而有机会向包含ViewPager的信号发送信号,而EditTeager没有焦点。 无法使用SetCurrentItem(),因为我使用的是半屏ViewPager页面(在ViewPagerAdapter中为PageWidth返回0.5f),当前在右侧的任何页面在调用SetCurrentItem时最终会自动向左移动,因为这是ViewPager的defualt行为,我不愿意重写这个function。 此外,还有一个此函数的内部/私有版本,如果不重写整个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(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(Resource.Id.ll_record_note_box); PagedFragmentRecordNoteBox userNotes.ParentFragment = this; PagedFragmentRecordNoteBox userNotes.PagerListener = _fragmentToViewPagerEvent; 

托管ViewPager的主要活动如下

 public class ParcelView : Activity { protected ViewPager _viewPager; private List _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 (片段主要布局之一):

  ...     ...  ...    ... 

RecordNoteBox.axml

     

RecordNotBoxInput.axml

   

PagedFragmentRecordNoteBoxInput.axml – 注意它包装在LinearLayout中。 这是为了避免通货膨胀例外。 不确定为什么有些视图需要被包装在ViewGroup中才能被夸大,但是它们确实如此(甚至更奇怪的是ViewGroup是View的子类,所以我可以搞清楚)。