1

これは、以前投稿した問題と似ていますが、別の問題です。

3つの「ページ」を含むHorizo​​ntalScrollViewがあります。私のアプリの起動時に、スクロールビューに 1 画面幅でスクロールするように指示して、中央のページが常に最初に表示されるようにします。下記参照:

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

上記の ET は EditText ビューを表します。スクロールビューが自動的に左端のページにスクロールするのを止めるために、EditText で setFocusable(false) を呼び出します。これにより、アプリを中央のページにとどめることができます。

一番左のページまでスクロールしたら、setFocusableInTouchMode(true) を呼び出して、EditText にテキストを入力できるようにします。

奇妙な部分が来ます:

1)タブレットにテキストを入力すると、スクロールビューが右端のページにスクロールします。私のタブレットには物理キーボードがあります。

2) タブレットから物理キーボードを取り外します。タブレットでテキストを入力すると、仮想キーボードが表示されるとすぐにスクロールビューが右端のページにスクロールします。

3)携帯電話でテキストを入力すると、スクロールビューが左端のページに残ります。EditText をタップすると、電話に仮想キーボードが表示されます。

スマートフォンが動作しないのに、タブレットが動作するのはなぜですか? 私のタブレットは携帯電話よりも古く、明らかに古いバージョンの Android を使用していますが、この動作の原因と停止方法を教えてください。

サンプル コードを提供しますが、考慮すべきことがたくさんあります。このコードでも、XML レイアウトは使用していません。右端のページはボタンで構成され、EditText のみが左端のページにあります。

更新: 右端のページを削除しても、左端ではなく 2 番目のページにジャンプします。その2番目のページにも、フォーカス可能なビューが追加されていないようです。

これは、私の問題を示す簡略化された MainActivity.java です。私の電話では発生しないので、特定の Android バージョンでのみ発生すると思われます。私のタブレットは Android 4.2.1 を実行しており、Asus 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 );
      } 
    });    
  }
}
4

2 に答える 2