如何在EditText验证后设置requestFocus

问题描述:

请注意,虽然这是一个重复的问题,但没有任何答案似乎有效。如何在EditText验证后设置requestFocus

注意我一直在尝试更多的东西,根据我添加的评论。总之,这个问题看起来很实际,requestFocus()实际上禁用了需要编辑的EditText,因为验证发现数据无效。

我有一个6 EditText视图的活动。目前我正在致力于修改日期。对于这个特定的EditText,我通过OnFocusChangedListener验证文本(目前这只是检查文本是否在8到10个字符之间),并且只有当焦点已经到达其他地方。

对于有效日期(考虑到目前进行的非常有限的验证)显示的时间戳,这似乎工作正常。如预期的那样发生。对于无效的日期(即少于8个或超过10个字符)而不是时间戳,会显示一条消息。

但是,对于无效的日期,我希望焦点回到EditText上。这是我遇到问题的地方。因为重点不在EditText上。另外EditText不能,据我所知,手动获取焦点(永久见后)。

我有一些消息写入日志。一个是侦听器被调用,另一个是遇到(!hasFocus)。我相信这表明我们正在遵循逻辑/过程,并且requestFocus实际上是将焦点放回EditText。所以很显然,某些东西正在消除焦点,我相信只要把重点放在EditText上就可以做到这一点。

另一个奇怪的/不常见的情况是,验证失败后,试图将焦点放在EditText上。光标在所讨论的EditText和以下EditText之间交替。

我看过很多帖子,在这里和其他地方(我目前有16个标签打开)。我尝试了很多东西。我在所有LinearLayout的开始以及XML中的所有EditText上都有focusable和focusableInTouchMode。我也将它们都放在我的活动中。我已经从XML中删除了输入类型(这是一张海报得出的结论)。另一个建议将focusables设置为false,然后回到true。我试图这样做,结果导致无尽的呼叫。我已经转换了Swift软键盘并使用默认值,结果是一样的。

无论如何,这里的代码(目前设置焦点为真两次)。

this.findViewById(R.id.apue_productusage_firstbuydate_data).setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      Log.i(Constants.LOG,"Focus Change Listener - Fired - Before Has Focus Check."); 
      EditText data_et = (EditText) findViewById(R.id.apue_productusage_firstbuydate_data); 
      TextView check_tv = (TextView) findViewById(R.id.apue_firstbuydate_check); 
      if(!hasFocus) { 
       Log.i(Constants.LOG,"Focus Change Listener - Fired AND it isn't me that is focused."); 
       String givendate = data_et.getText().toString(); 
       Emsg emsg = validateDate(givendate); 
       if(emsg.getErrorIndicator()) { 
        check_tv.setText(emsg.getErrorMessage()); 
        //check_tv.requestFocus(); 
        data_et.setText(data_et.getText()); 
        //data_et.setHint("DD/MM/YYYY"); 
        data_et.setFocusable(true); 
        data_et.setFocusableInTouchMode(true); 
        data_et.requestFocusFromTouch(); 
        //data_et.setFocusable(false); These two, this and InTouchMode, caused an endless loop (had to kill) 
        //data_et.setFocusableInTouchMode(false); 
        data_et.setFocusable(true); 
        data_et.setFocusableInTouchMode(true); 
        data_et.requestFocus(); 
        if(!data_et.isFocusable()) { 
         Log.i(Constants.LOG,"I am not Focusable even though id had both setFocusable and setFocusableInTouchMode set to true!!!!"); 
        } 
        if(!data_et.isFocusableInTouchMode()) { 
         Log.i(Constants.LOG,"I am not FocusableInTouchMode even though id had both setFocusable and setFocusableInTouchMode set to true!!!!"); 
        } 
        //data_et.requestFocus(View.FOCUS_UP,null); 
        return; 
       } 
       try { 
        Date date = sdf.parse(givendate); 
        long timestamp = date.getTime(); 
        ((TextView) findViewById(R.id.apue_firstbuydate_check)).setText(Long.toString(timestamp)); 
       } catch (ParseException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 

.....

public Emsg validateDate(String datetocheck) { 
    Emsg retmsg = new Emsg(false, 0, ""); 
    // Valid Length Check ie must be a minimum of 8 characters in Length and a maximum of 10 
    if(datetocheck.length() < 8 | datetocheck.length() > 10) { 
     retmsg.setAll(true, 1, "Invalid Length (must be 8-10) it was " + datetocheck.length()); 
     return retmsg; 
    } 
    return retmsg; 
} 

的XML(对不起,这个长度,EditText上的问题是apue_productusage_firstbuydate_data和大约2 /三分之二向下): -

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginStart="@dimen/activity_horizontal_margin" 
    android:layout_marginLeft="@dimen/activity_horizontal_margin"> 
    <LinearLayout 
     android:id="@+id/apue_shop_container" 
     android:layout_width="match_parent" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_height="@dimen/standard_heading_height" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/apue_shopname_label" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="@string/shopnamelabel" 
      android:textSize="@dimen/standard_heading_text_size" 
      android:textStyle="bold"/> 
     <TextView 
      android:id="@+id/apue_shopname_data" 
      android:layout_width="500dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="" 
      android:textSize="@dimen/standard_listview_row_height"/> 
     <TextView 
      android:id="@+id/apue_shop_id" 
      android:layout_width="@dimen/standard_realnumb_width" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:textSize="@dimen/standard_listview_row_height" 
      android:textColor="@color/colorRequiredLabel"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_aisle_container" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_heading_height" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/apue_aislename_label" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="@string/aislelabel" 
      android:textSize="@dimen/standard_heading_text_size" 
      android:textStyle="bold"/> 
     <TextView 
      android:id="@+id/apue_aislename_data" 
      android:layout_width="500dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="" 
      android:textSize="@dimen/standard_listview_row_height"/> 
     <TextView 
      android:id="@+id/apue_aisle_id" 
      android:layout_width="@dimen/standard_realnumb_width" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:textSize="@dimen/standard_listview_row_height" 
      android:textColor="@color/colorRequiredLabel"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_product_container" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_heading_height" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/apue_product_label" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="@string/productlabel" 
      android:textSize="@dimen/standard_heading_text_size" 
      android:textStyle="bold"/> 
     <TextView 
      android:id="@+id/apue_product_data" 
      android:layout_width="500dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="" 
      android:textSize="@dimen/standard_listview_row_height"/> 
     <TextView 
      android:id="@+id/apue_product_id" 
      android:layout_width="@dimen/standard_realnumb_width" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:textSize="@dimen/standard_listview_row_height" 
      android:textColor="@color/colorRequiredLabel"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_productcost_container" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_heading_height" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/apue_productcost_label" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="@string/productusage_cost_label" 
      android:textSize="@dimen/standard_heading_text_size" 
      android:textStyle="bold"/> 
     <EditText 
      android:id="@+id/apue_productcost_data" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:layout_width="@dimen/standard_realnumb_width" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="" 
      android:padding="0dp" 
      android:textSize="@dimen/standard_listview_row_height"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_productusage_orderinaisle_container" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_heading_height" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/apue_product_orderinaisle_label" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="@string/productusage_orderinaisle_label" 
      android:textSize="@dimen/standard_heading_text_size" 
      android:textStyle="bold"/> 
     <EditText 
      android:id="@+id/apue_productusage_orderinaisle_data" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:padding="0dp" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="" 
      android:textSize="@dimen/standard_listview_row_height"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_advancedoptions_explian_text_container" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_heading_height"> 
     <TextView 
      android:id="@+id/apue_advancedoptions_explian_text" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/standard_subheading_height" 
      android:text="@string/productusage_advanced_options_explanatory_text" 
      android:textSize="@dimen/standard_subheading_text_size" 
      android:textColor="@color/advancedinputoption" 
      android:textStyle="bold|italic"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_productusage_buycount_container" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_heading_height" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/apue_product_buycount_label" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="@string/productusage_buycount_label" 
      android:textSize="@dimen/standard_heading_text_size" 
      android:textStyle="bold|italic" 
      android:textColor="@color/advancedinputoption"/> 
     <EditText 
      android:id="@+id/apue_productusage_buycount_data" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:padding="0dp" 
      android:text="" 
      android:textSize="@dimen/standard_listview_row_height"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_productusage_firstbuydate_container" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_heading_height" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/apue_product_firstbuydate_label" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="@string/productusage_firstbuydate_label" 
      android:textSize="@dimen/standard_heading_text_size" 
      android:textStyle="bold|italic" 
      android:textColor="@color/advancedinputoption"/> 
     <EditText 
      android:id="@+id/apue_productusage_firstbuydate_data" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:padding="0dp" 
      android:textSize="@dimen/standard_listview_row_height"/> 
     <TextView 
      android:id="@+id/apue_firstbuydate_check" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:padding="0dp" 
      android:textSize="18dp"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_productusage_lastbuydate_container" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_heading_height" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/apue_product_lastbuydate_label" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="@string/productusage_lastbuydate_label" 
      android:textSize="@dimen/standard_heading_text_size" 
      android:textStyle="bold|italic" 
      android:textColor="@color/advancedinputoption"/> 
     <EditText 
      android:id="@+id/apue_productusage_lastbuydate_data" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="" 
      android:padding="0dp" 
      android:textSize="@dimen/standard_listview_row_height"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_productusage_mincost_container" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_heading_height" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/apue_product_mincost_label" 
      android:layout_width="200dp" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="@string/productusage_mincost_label" 
      android:textSize="@dimen/standard_heading_text_size" 
      android:textStyle="bold|italic" 
      android:textColor="@color/advancedinputoption"/> 
     <EditText 
      android:id="@+id/apue_productusage_mincost_data" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:text="" 
      android:padding="0dp" 
      android:textSize="@dimen/standard_listview_row_height"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/apue_actions" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/standard_button_height" 
     android:gravity="right" 
     android:orientation="horizontal"> 
     <Button 
      android:id="@+id/apue_savechanges" 
      android:layout_width="@dimen/standard_button_width" 
      android:layout_height="@dimen/standard_button_height" 
      android:backgroundTint="@color/colorNormalButton" 
      android:textColor="@color/colorNormalButtonText" 
      android:text="@string/standardsavebutton"/> 
     <Button 
      android:id="@+id/apue_advancedoptions" 
      android:layout_width="@dimen/standard_button_width" 
      android:layout_height="@dimen/standard_button_height" 
      android:backgroundTint="@color/colorNormalButton" 
      android:textColor="@color/colorNormalButtonText" 
      android:text="@string/standardmoretext" 
      android:onClick="apue_advancedoptions_flip"/> 
     <Button 
      android:id="@+id/apue_done" 
      android:layout_width="@dimen/standard_button_width" 
      android:layout_height="@dimen/standard_button_height" 
      android:backgroundTint="@color/colorNormalButton" 
      android:textColor="@color/colorNormalButtonText" 
      android:text="@string/standarddonebutton" 
      android:onClick="apue_done"/> 
    </LinearLayout> 
</LinearLayout> 

下面是一个典型的日志,我已经改变日期为无效日期(注意isfocuable检查都从来没有发射,因此排除不会出现申请按

公共最后布尔requestFocus()方法调用 这试着给集中到一个特定的fic视图或其 后代之一,并提供关于重点目标方向的提示。 如果视图不可聚焦,则在触摸模式下,当设备为 时,视图实际上不会聚焦 (isFocusable()返回false),或者聚焦在触摸模式(isFocusableInTouchMode())中,而不是 。 从developer.android.com/intl/ko/reference/android/view/View.html#requestFocus()

这里的日志(相关部分(对焦变化信息)是从22:38:27.192这是周围的路往下3/4): -

03-01 22:38:04.304 24757-24757/? I/Timeline: Timeline: Activity_launch_request id:mjt.shopper time:2150430366 
03-01 22:38:04.305 769-1316/? V/ActivityManager: notify app switch for new activity mjt.shopper Where 1 
03-01 22:38:04.306 769-1316/? I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=mjt.shopper/.MainActivity (has extras)} from uid 10025 on display 0 
03-01 22:38:04.308 769-28600/? D/ActivityManager: notifyAppSwitch resumed: true; pkg:mjt.shopper 
03-01 22:38:04.310 769-1316/? V/WindowManager: addAppToken: AppWindowToken{11fa5df1 token=Token{19a3f198 ActivityRecord{3fc47f7b u0 mjt.shopper/.MainActivity t1012}}} to stack=1 task=1012 at 0 
03-01 22:38:04.323 769-795/? V/WindowManager: Adding window Window{22eb5bb0 u0 Starting mjt.shopper} at 3 of 9 (after Window{a17be98 u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher}) 
03-01 22:38:04.396 769-32022/? I/ActivityManager: Start proc 28604:mjt.shopper/u0a121 for activity mjt.shopper/.MainActivity 
03-01 22:38:04.530 28604-28604/? I/mjt.shopper: onExpand started. 
03-01 22:38:04.588 28604-28604/? I/mjt.shopper: onExpand completed. 
03-01 22:38:04.734 769-1347/? V/WindowManager: Adding window Window{b38efe5 u0 mjt.shopper/mjt.shopper.MainActivity} at 3 of 10 (before Window{22eb5bb0 u0 Starting mjt.shopper}) 
03-01 22:38:04.891 769-795/? I/ActivityManager: Displayed mjt.shopper/.MainActivity: +536ms 
03-01 22:38:04.891 769-795/? I/Timeline: Timeline: Activity_windows_visible id: ActivityRecord{3fc47f7b u0 mjt.shopper/.MainActivity t1012} time:2150430953 
03-01 22:38:08.659 28604-28604/? I/Timeline: Timeline: Activity_launch_request id:mjt.shopper time:2150434722 
03-01 22:38:08.660 769-9335/? V/ActivityManager: notify app switch for new activity mjt.shopper Where 0 
03-01 22:38:08.661 769-9335/? I/ActivityManager: START u0 {cmp=mjt.shopper/.ShopListByCursorActivity (has extras)} from uid 10121 on display 0 
03-01 22:38:08.667 769-9335/? V/WindowManager: addAppToken: AppWindowToken{1c1e369d token=Token{3dfa5174 ActivityRecord{2dd34547 u0 mjt.shopper/.ShopListByCursorActivity t1012}}} to stack=1 task=1012 at 1 
03-01 22:38:08.679 769-1301/? D/AppOps: noteOperation: allowing code 11 uid 10121 package mjt.shopper 
03-01 22:38:08.681 769-28630/? D/ActivityManager: notifyAppSwitch resumed: true; pkg:mjt.shopper 
03-01 22:38:08.773 769-20945/? V/WindowManager: Adding window Window{2f2c9f99 u0 mjt.shopper/mjt.shopper.ShopListByCursorActivity} at 4 of 11 (after Window{b38efe5 u0 mjt.shopper/mjt.shopper.MainActivity}) 
03-01 22:38:09.284 769-795/? I/ActivityManager: Displayed mjt.shopper/.ShopListByCursorActivity: +592ms 
03-01 22:38:09.491 769-795/? I/Timeline: Timeline: Activity_windows_visible id: ActivityRecord{2dd34547 u0 mjt.shopper/.ShopListByCursorActivity t1012} time:2150435554 
03-01 22:38:11.264 769-1180/? V/WindowManager: not Base app: Adding window Window{e120e37 u0 mjt.shopper/mjt.shopper.ShopListByCursorActivity} at 5 of 11 
03-01 22:38:13.329 28604-28604/? I/Timeline: Timeline: Activity_launch_request id:mjt.shopper time:2150439392 
03-01 22:38:13.331 769-1301/? V/ActivityManager: notify app switch for new activity mjt.shopper Where 0 
03-01 22:38:13.331 769-1301/? I/ActivityManager: START u0 {cmp=mjt.shopper/.AddProductToShopActivity (has extras)} from uid 10121 on display 0 
03-01 22:38:13.336 769-28645/? D/ActivityManager: notifyAppSwitch resumed: true; pkg:mjt.shopper 
03-01 22:38:13.343 769-1301/? V/WindowManager: addAppToken: AppWindowToken{298e7210 token=Token{31ef56d3 ActivityRecord{d1398c2 u0 mjt.shopper/.AddProductToShopActivity t1012}}} to stack=1 task=1012 at 2 
03-01 22:38:13.501 769-30333/? V/WindowManager: Adding window Window{164e8d2f u0 mjt.shopper/mjt.shopper.AddProductToShopActivity} at 5 of 11 (after Window{2f2c9f99 u0 mjt.shopper/mjt.shopper.ShopListByCursorActivity}) 
03-01 22:38:14.095 769-795/? I/ActivityManager: Displayed mjt.shopper/.AddProductToShopActivity: +721ms 
03-01 22:38:14.268 769-795/? I/Timeline: Timeline: Activity_windows_visible id: ActivityRecord{d1398c2 u0 mjt.shopper/.AddProductToShopActivity t1012} time:2150440331 
03-01 22:38:17.189 769-785/? V/WindowManager: not Base app: Adding window Window{18b9ac3 u0 mjt.shopper/mjt.shopper.AddProductToShopActivity} at 6 of 12 
03-01 22:38:21.695 769-1323/? D/AppOps: noteOperation: allowing code 11 uid 10121 package mjt.shopper 
03-01 22:38:21.702 28604-28604/? I/Timeline: Timeline: Activity_launch_request id:mjt.shopper time:2150447764 
03-01 22:38:21.703 769-32022/? V/ActivityManager: notify app switch for new activity mjt.shopper Where 0 
03-01 22:38:21.704 769-32022/? I/ActivityManager: START u0 {cmp=mjt.shopper/.ProductUsageEdit (has extras)} from uid 10121 on display 0 
03-01 22:38:21.715 769-28664/? D/ActivityManager: notifyAppSwitch resumed: true; pkg:mjt.shopper 
03-01 22:38:21.721 769-32022/? V/WindowManager: addAppToken: AppWindowToken{24f3a1ca token=Token{2d14e935 ActivityRecord{5184f6c u0 mjt.shopper/.ProductUsageEdit t1012}}} to stack=1 task=1012 at 3 
03-01 22:38:21.910 769-785/? V/WindowManager: Adding window Window{6ab2004 u0 mjt.shopper/mjt.shopper.ProductUsageEdit} at 6 of 13 (after Window{164e8d2f u0 mjt.shopper/mjt.shopper.AddProductToShopActivity}) 
03-01 22:38:22.036 769-795/? I/ActivityManager: Displayed mjt.shopper/.ProductUsageEdit: +273ms 
03-01 22:38:22.243 769-795/? I/Timeline: Timeline: Activity_windows_visible id: ActivityRecord{5184f6c u0 mjt.shopper/.ProductUsageEdit t1012} time:2150448306 
03-01 22:38:27.192 28604-28604/? I/mjt.shopper: Focus Change Listener - Fired - Before Has Focus Check. 
03-01 22:38:27.220 769-32022/? V/WindowManager: Adding window Window{3a989234 u0 PopupWindow:216f0592} at 7 of 13 (after Window{6ab2004 u0 mjt.shopper/mjt.shopper.ProductUsageEdit}) 
03-01 22:38:47.465 28604-28604/? I/mjt.shopper: Focus Change Listener - Fired - Before Has Focus Check. 
03-01 22:38:47.465 28604-28604/? I/mjt.shopper: Focus Change Listener - Fired AND it isn't me that is focused. 
03-01 22:38:47.487 28604-28604/? I/mjt.shopper: Focus Change Listener - Fired - Before Has Focus Check. 
03-01 22:38:47.523 769-873/? V/WindowManager: Adding window Window{20591f6 u0 PopupWindow:ae45019} at 7 of 13 (after Window{6ab2004 u0 mjt.shopper/mjt.shopper.ProductUsageEdit}) 
03-01 22:38:52.016 769-9335/? V/WindowManager: Adding window Window{109fec9 u0 PopupWindow:581fabf} at 7 of 13 (after Window{6ab2004 u0 mjt.shopper/mjt.shopper.ProductUsageEdit}) 
+0

我一直在努力。我将布局更改为单个相对布局,而不是多个线性布局。行为没有改变。然后,我将大多数后验证无效日期代码注释掉,只设置检查/结果TextView中的文本(即不设置焦点)。 EditText然后可以手动聚焦和编辑。现在我将逐步添加注释掉的行,以便查看导致行为的原因。 – MikeT

+0

加入的第一行是'check_tv.requestFocus();'将焦点设置为显示消息验证错误消息或时间戳的TextView。这没有引入这个问题。 – MikeT

+0

下一行加入'data_et.setFocusable(true);'这没有引入这个问题。 – MikeT

我通过在onFocusChangeListener之外执行验证和随后的requestFocus来解决问题。相反,我通过保存按钮调用验证和requestFocus。但是,这不是理想的情况,因为需要验证大量的EditText。

看来,从相应的EditText的OnFocusChangeListener中为自身设置EditText的焦点是简单的可撤销的。