Android EditText文本条目导致滚动
这是一个类似于我之前发布的问题——但不同 我有一个包含3页的水平滚动视图。当我的应用程序启动时,我告诉scrollview滚动一个屏幕宽度,以便始终首先显示中间页面。见下文:Android EditText文本条目导致滚动,android,android-edittext,android-scrollview,horizontalscrollview,focusable,Android,Android Edittext,Android Scrollview,Horizontalscrollview,Focusable,这是一个类似于我之前发布的问题——但不同 我有一个包含3页的水平滚动视图。当我的应用程序启动时,我告诉scrollview滚动一个屏幕宽度,以便始终首先显示中间页面。见下文: +------+------+------+ + ET + + + +------+ + + + + + + + + + + +------+------+------+ ^ ^ 上面的ET表示
+------+------+------+
+ ET + + +
+------+ + +
+ + + +
+ + + +
+------+------+------+
^ ^
上面的ET表示EditText视图。为了阻止scrollview自动滚动到最左边的页面,我在EditText上调用setFocusable(false)。这允许我的应用程序停留在中央页面上
当我滚动到最左边的页面时,我调用setFocusableInTouchMode(true)以允许在EditText中输入文本
现在是奇怪的部分:
1) 当我在平板电脑上输入文本时,滚动视图会滚动到最右边的页面。我的平板电脑有一个物理键盘
2) 我从平板电脑上卸下物理键盘。当我在平板电脑上输入文本时,一旦显示虚拟键盘,scrollview就会滚动到最右边的页面
3) 当我在手机上输入文本时,滚动视图将保持在最左边的页面上。当我点击编辑文本时,手机会显示虚拟键盘
为什么我的平板电脑能做到这一点,而我的手机却不能?我的平板电脑比我的手机旧,而且显然有一个旧版本的安卓系统,但是什么导致了这种行为?我该如何阻止它
我会提供示例代码,但还有很多需要考虑的因素。我在这段代码中也没有使用XML布局。最右边的页面由按钮组成-唯一的编辑文本位于最左边的页面上
更新:如果我删除最右边的页面,它仍然会跳转到第二个页面,而不是最左边的页面。在第二页上,我似乎也没有任何其他可聚焦的视图
下面是一个简化的MainActivity.java,它说明了我的问题。请注意,这不会发生在我的手机上,所以我怀疑这只会发生在某些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 );
}
});
}
}
在编辑文本中试试这个
mEditText.setGravity( Gravity.CENTER );
删除它我找到了我的解决方案-覆盖scrollTo(),什么也不做