重新加载可扩展列表时如何重新关注编辑文本...?

Posted

技术标签:

【中文标题】重新加载可扩展列表时如何重新关注编辑文本...?【英文标题】:how to regain focus on a edit text when expandable list is reloaded...? 【发布时间】:2011-12-12 11:29:57 【问题描述】:

我有一个 ExpandableListView,我在其中加载了组视图和子视图中的自定义布局。

他们有一些编辑文本字段。

当我点击编辑文本时,出现软键盘,此时重新加载列表,但焦点不会在编辑文本上。

因此,我输入的输入没有输入到该编辑文本中。

如果我再次单击编辑文本,我可以输入值。

但即使在重新加载列表视图后,我也想重新获得焦点。

我尝试在重新加载时存储最后点击的视图并将其存储在临时变量 requestFocus() 中,但它不起作用。

如何做到这一点..?

这是一个屏幕截图。

如果有人有想法,请帮助我..!

提前致谢。

【问题讨论】:

它非常庞大,适配器有 600 行代码。它涉及 6 个自定义布局。 【参考方案1】:

我尝试存储最后点击的视图并将其存储在临时 变量,requestFocus() 正在重新加载,但它不起作用。

什么不工作?您的活动是否正在重新创建,因此临时变量正在丢失?如果是这样,那么这个答案可能会对您有所帮助。

我以前没有使用过 ExpandableListView,但我不得不在我的代码中解决类似的问题。当方向改变发生时,活动被销毁然后重新创建,所以我使用onRetainNonConfigurationInstance() 来存储我想要保留的信息。

这里有一些示例代码:

  protected StoredState mStoredState;

  @Override
  public void onCreate(Bundle savedInstanceState)
  
    super.onCreate(savedInstanceState);

    final Object data = getLastNonConfigurationInstance();

    if (data == null)
    
      // First time initialization
      mStoredState = new StoredState();
    
    else
    
      // StoredState data exists
      mStoredState = (StoredState)data;

      if (mStoredState.mFieldToGiveFocusTo != -1)
      
        // Give focus to the field that had focus before the
        // activity was recreated
        View viewToFocus = findViewById(mStoredState.mFieldToGiveFocusTo);
        viewToFocus.requestFocus();
      
    
  

  @Override
  public Object onRetainNonConfigurationInstance()
  
    return mStoredState;
  

  /**
   * Class to store the information about this activity when the orientation
   * is changed
   */
  private static class StoredState
  
    int mFieldToGiveFocusTo;

    private StoredState()
    
      mFieldToGiveFocusTo = -1;
    
  

那么你只需要在用户第一次触摸EditText时设置mStoredState.mFieldToGiveFocusTo

【讨论】:

我的活动不再创建...!在同一个活动中,列表正在重新加载。【参考方案2】:

我在onCreate()onResume() 中调用requestFocus() 时遇到了类似的问题。我能够通过稍微延迟设置焦点来解决这个问题。像这样的东西可能对你有用:

new Handler().postDelayed(new Runnable() 

            @Override
            public void run() 
                viewToFocus.requestFocus();

            
        , 100);

我认为问题的根源可能是androidFramework在处理onResume()之后设置了焦点。因此,延迟可能会有所帮助。

【讨论】:

【参考方案3】:

为您的活动管理 SoftInput 键盘。

看看android:windowSoftInputMode

【讨论】:

【参考方案4】:

我想你会在这里找到答案: ExpandableListView child items don't get focus when touched

这个人的问题和你的一样。

【讨论】:

【参考方案5】:

listView展开后,通过添加此行获得对editText的强制获得焦点,

editText.requestFocus();

【讨论】:

以上是关于重新加载可扩展列表时如何重新关注编辑文本...?的主要内容,如果未能解决你的问题,请参考以下文章

内容可编辑在刷新时丢失其选项卡/新行

UITableView 重新加载部分时的内容插入更改

如何在编辑表格视图单元格中的文本字段时重新加载所有表格视图单元格 - iOS Swift

从 segued View 返回时如何重新加载 iCarousel?

如何自动重新加载我正在开发的 Chrome 扩展程序?

Flutter - 可重新排序的列表,Listview 嵌套在 expandtile 内