【问题标题】:Android EditText text entry causing scrollAndroid EditText 文本输入导致滚动
【发布时间】:2014-10-19 13:05:40
【问题描述】:

这与我之前发布的问题相似 - 但不同。

我有一个包含 3 个“页面”的 Horizo​​ntalScrollView。当我的应用程序启动时,我告诉滚动视图滚动一个屏幕宽度,以便始终首先显示中间页面。见下文:

+------+------+------+
+  ET  +      +      +
+------+      +      +
+      +      +      +
+      +      +      +
+------+------+------+
       ^      ^

上面的 ET 代表一个 EditText 视图。为了阻止我的滚动视图自动滚动到最左边的页面,我在 EditText 上调用 setFocusable(false)。这使我的应用可以停留在中心页面上。

当我滚动到最左边的页面时,我调用 setFocusableInTouchMode(true) 以允许在 EditText 中输入文本。

现在是奇怪的部分:

1) 当我在平板电脑上 输入文本时,滚动视图会滚动到最右侧的页面。我的平板电脑有一个物理键盘。

2) 我从平板电脑上移除了物理键盘。当我在平板电脑上输入文本时,只要显示虚拟键盘,滚动视图就会滚动到最右侧的页面。

3) 当我在手机上 输入文本时,滚动视图应保持在最左侧的页面上。当我点击 EditText 时,我的手机会显示虚拟键盘。

为什么我的平板电脑会这样,而我的手机却没有?我的平板电脑比我的手机旧,而且显然有旧版本的 Android,但是是什么导致了这种行为,我该如何阻止它?

我会提供示例代码,但需要考虑的因素很多。我也没有在这段代码中使用 XML 布局。最右边的页面由按钮组成 - 唯一的 EditText 在最左边的页面上。

更新:如果我删除最右边的页面,它仍然会跳转到第二页而不是最左边。我在第二页上似乎也没有任何其他可聚焦的视图。

这是一个简化的 MainActivity.java,它说明了我的问题。请注意,它不会发生在我的手机上,所以我怀疑它只会发生在某些 Android 版本上。我的平板电脑运行的是 Android 4.2.1 及其华硕 Transformer Pad TF300TG。

package com.example.testscroll;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Gravity;
import android.widget.EditText;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.ListView;

public class MainActivity extends Activity
{
  public HorizontalScrollView testScrollView;
  public int screenWidth, screenHeight;

  LinearLayout mLeftBaseLinearLayout;
  EditText     mEditText;
  ListView     mListView;

  TextWatcher mTextWatcher = new TextWatcher() 
  {
    @Override
    public void afterTextChanged( Editable s ) 
    {
      String sSimple = s.toString();
      System.out.printf(  "Text now[" + sSimple + "]\n" );
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after){}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count){}     
  };


  @Override
  protected void onCreate( Bundle savedInstanceState )
  {
    super.onCreate( savedInstanceState );

    Point size = new Point();

    getWindowManager().getDefaultDisplay().getSize( size );

    screenWidth  = size.x;
    screenHeight = size.y;

    LinearLayout layout = new LinearLayout( this );
    layout.setLayoutParams( new LinearLayout.LayoutParams( 3 * screenWidth, LinearLayout.LayoutParams.MATCH_PARENT ) );
    layout.setOrientation( LinearLayout.HORIZONTAL );

    //-------- LEFT PAGE --------
    mLeftBaseLinearLayout = new LinearLayout( this );
    mLeftBaseLinearLayout.setLayoutParams( new LinearLayout.LayoutParams( screenWidth, screenHeight ) );
    mLeftBaseLinearLayout.setOrientation( LinearLayout.VERTICAL );
    mLeftBaseLinearLayout.setBackgroundColor( Color.TRANSPARENT );

    mEditText = new EditText( this );

    mEditText.setWidth( screenWidth );
    mEditText.setHeight( 20 );
    mEditText.setBackgroundColor( Color.DKGRAY );
    mEditText.setGravity( Gravity.CENTER );
    mEditText.setText( "" );
    mEditText.setTextColor( Color.YELLOW );
    mEditText.setTextSize( 30 );
    mEditText.setSingleLine();
    mEditText.setLayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT ) );

    //mEditText.setFocusable( false );
    mEditText.setFocusable( true );
    mEditText.addTextChangedListener( mTextWatcher );

    mListView = new ListView( this );
    mListView.setBackgroundColor( Color.WHITE );
    mListView.setLayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1 ) );

    //mLeftBaseLinearLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
    mLeftBaseLinearLayout.addView( mEditText );    
    mLeftBaseLinearLayout.addView( mListView );
    //-------    

    layout.addView( mLeftBaseLinearLayout );

    LinearLayout linLayout   = new LinearLayout( this );
    linLayout.setBackgroundColor( Color.GREEN );    
    linLayout.setLayoutParams( new LinearLayout.LayoutParams( 1280, LinearLayout.LayoutParams.MATCH_PARENT ) );
    layout.addView( linLayout );

    testScrollView     = new HorizontalScrollView( this );
    testScrollView.setLayoutParams( new LinearLayout.LayoutParams( 3 * screenWidth, LinearLayout.LayoutParams.MATCH_PARENT ) );
    testScrollView.addView( layout );

    setContentView( testScrollView );

    testScrollView.post( new Runnable() 
    { 
      public void run() 
      { 
        testScrollView.scrollTo( screenWidth, 0 );
      } 
    });    
  }
}

【问题讨论】:

    标签: android android-edittext android-scrollview horizontalscrollview focusable


    【解决方案1】:

    在 EditText 中试试这个

    mEditText.setGravity( Gravity.CENTER ); 
    

    删除它

    【讨论】:

      【解决方案2】:

      我找到了我的解决方案 - 覆盖 scrollTo() 并且什么都不做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-15
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        • 2020-08-12
        相关资源
        最近更新 更多