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

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

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

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

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

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

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

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

如何做到这一点..?

这是一个屏幕截图。

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

提前致谢。

【问题讨论】:

  • 它非常庞大,适配器有 600 行代码。它涉及 6 个自定义布局。

标签: android android-widget android-edittext expandablelistview lost-focus


【解决方案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();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-24
          相关资源
          最近更新 更多