13

花了很多时间解决这个问题,看起来很容易,但我真的很累,找不到解决方案。我有一个活动,活动有 4 个 EditText 组件,其中 2 个有弹出菜单(AlertDialog),其中包含列表,下一个 - 禁用编辑,最后一个 - 可编辑,并且应该显示软键盘,当用户是点击它。

另外,我的根 LinearLayout 有 LinearLayout 包含在 RelativeLayout 中。最后一个是需要 AdvBanner。最后一个 LinearLayout(RelativeLayout) 与根布局的底部对齐。

XML 中描述它的部分:

  <LinearLayout
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_gravity="bottom"
      android:focusable="false"
      android:focusableInTouchMode="false" 
      android:gravity="bottom">
  <RelativeLayout 
      android:id="@+id/AdvLayoutReserveArea" 
      android:layout_width="fill_parent" 
      android:layout_height="50dp" 
      android:background="#FFFFFF"
      android:focusable="false"
      android:focusableInTouchMode="false" 
      android:gravity="bottom" /> 
  </LinearLayout>

活动开始时,可​​编辑的 EditText 以绿色边框为焦点,光标闪烁。几秒钟后,AdvBanner 被加载并显示。当它发生时,可编辑的 EditText 失去了焦点。从这一刻开始,我的生活就像一场噩梦。

让我们一步一步看。

问题 1. 如果在这个时刻(当 Adv 加载并出现时)用户正在通过软键盘编辑 EditText 字段,焦点丢失,边框采用灰色,如果用户继续输入文本没有结果 - 符号是未打印(EditText 中的 CURSOR 太丢失)。

我认为任何用户都会感到恼火 - 当您输入文本时,光标处于非活动状态,因为在后台加载了一些广告并且它会专注于自己。

为了解决这个问题,在加载 Adv 的方法中(如图所示),我尝试通过 requestFocus 方法手动将焦点返回到 EditText。

public void onAdLoaded() 
    {
// TODO Auto-generated method stub
// add app specific code for this event here...
// called when an ad is successfully displayed on device            
    CountEdit1.requestFocus();
}

是的,光标返回到 EditText 字段,如果软键盘处于活动状态,用户仍然可以输入文本,但 EditText 字段的边框保持灰色...

注意:实际上我不确定重点 EditText 的绿色和灰色边框之间的区别。绿色通常是用户点击它时,而灰色,可能是当我们想要手动请求焦点时(使用 requestFocus() 等)

问题 2。(作为解决问题 #1 的结果)。软键盘关闭后,如果用户点击可编辑的 EditText 字段,它会获得焦点并且光标出现在里面,但再次显示软键盘没有反应!点击它不会显示软键盘,但看起来像复制模式下的编辑字段 - 当用户可以选择文本并将其剪切/复制到剪贴板时。

我的目标很容易看一眼。我只想在显示软键盘和用户输入一些文本时保存光标并聚焦到可编辑的 EditText 字段(CountEdit1)。用户点击 EditText 时的正常反应 - 像往常一样,只给我看软键盘!

我在这里阅读了所有问题,我结合了不同的方法(clearFocus、requestFocusFromTouch 等),只是没有足够的时间和空间来描述我为解决这个问题而尝试做的所有事情。主要问题如上所述。

希望得到帮助并解决问题...在此先感谢..

4

5 回答 5

18

目标解决了,解决方法比我想象的要容易。问题 #2 通过使用 onClick () 方法得到解决。使用 clearFocus() 和 requestFocus() 方法的软键盘出现的充分条件。

   CountEdit1.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v)
      {
              CountEdit1.clearFocus();
        CountEdit1.requestFocus();
      }
    });

当用户点击 EditText 字段时会出现软键盘。固定的。

于 2012-07-02T00:47:06.287 回答
8

为我工作:

InputMethodManager mgr = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
editField.requestFocus();
mgr.showSoftInput(editField, InputMethodManager.SHOW_IMPLICIT);
于 2012-11-02T11:14:56.067 回答
5
userInput.post(new Runnable() {
            public void run() {
                userIdInput.requestFocus();

            }
        });

试一试,看看您的问题是否仍未解决。

于 2012-07-01T12:23:26.470 回答
1

在片段或活动中创建视图后,您应该请求焦点:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    CountEdit1.requestFocus();
}
于 2014-06-30T12:38:05.723 回答
1

尝试这个:

public void onAdLoaded() 
    {  
  final Handler handler = new Handler();
             handler.postDelayed(new Runnable() {
                 @Override
                 public void run() {
                     CountEdit1.requestFocus();
                     InputMethodManager mgr = (InputMethodManager) base.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                     mgr.showSoftInput(CountEdit1, InputMethodManager.SHOW_IMPLICIT);
                     CountEdit1.setSelection(CountEdit1.getText().length());
                 }
             },0);
}
于 2016-06-15T11:50:32.973 回答