Androidアクティビティが常に一番下までスクロールし始めるのはなぜですか?


91

私がこのアクティビティを開始するときはいつでも、それは常にボトムアウトで始まり、一番下までスクロールしました。スクロール位置を変更すると予想されるOnCreateアクティビティ(またはそのことについてはどこでも)で奇妙なことをしていません。フォーカスを最上位のフォーカス可能なコントロールとscrolltoメソッドに設定しようとしましたが、どちらも機能していません。その上、他の私の活動のどれもこの問題を持っていません。ここにレイアウトがあります:

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scroll"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edit_refresh_update_header"
            android:textSize="18sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Variable:"
            android:textSize="18sp"/>

        <Spinner
            android:id="@+id/edit_refresh_variables_spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Network:"
            android:textSize="18sp"/>

        <RadioGroup
            android:id="@+id/widget1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical">

            <RadioButton
                android:text="Web"
                android:id="@+id/edit_refresh_update_rb_web"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="NetRadioButtonSelected"
                android:checked="true"/>

            <RadioButton
                android:text="Socket Server"
                android:id="@+id/edit_refresh_update_rb_socket_server"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="NetRadioButtonSelected"/>
        </RadioGroup>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Socket server request type:"
            android:textSize="18sp"/>

        <Spinner
            android:id="@+id/edit_refresh_socket_server_req_types_spinner"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Socket server body:"
            android:textSize="18sp"/>

        <EditText
            android:layout_width="match_parent"
            android:id="@+id/edit_refresh_update_ss_body"
            android:layout_height="wrap_content"
            android:enabled="false"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Url:"
            android:textSize="18sp"/>

        <EditText
            android:layout_width="match_parent"
            android:id="@+id/edit_refresh_update_url"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <Button
            android:text="Save refresh update"
            android:id="@+id/edit_refresh_save_btn"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginBottom="20dp"
            android:layout_alignParentBottom="true"
            android:onClick="SaveRefreshUpdate">
        </Button>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>
    </LinearLayout>
</ScrollView>

どのくらい正確に焦点を変えようとしましたか?
devmiles.com

1
以下で説明するfulscrollメソッドと、以下で説明するscrolltoメソッドを使用します。私は必ずしもこの方法で修正することを気にしませんが、それがそのように始まっている理由があるに違いないので、それを修正して修正したいのです。
MrGibbage 2012年

回答:


306

Androidがアクティビティを開始するとき、いくつかのコントロールがフォーカスを取得する必要があります。フォーカスを取得するために指定されたコントロールがない場合、システムはフォーカスを必要とする最初の適格なコントロールを選択します。あなたのLinearLayoutで次のプロパティを設定している場合- android:focusableInTouchMode="true"あなたはLinearLayoutスタートを中心に説明すると、あなたの活動はにスクロールしませんEditText下インチ


GridLayoutで動作しません。レイアウトの中央にGridViewがあり、毎回フォーカスされます。
Iqbal、2016年

2
丸一日頭を掻きましたが、なぜそれが1つの特定のアクティビティだけで起こっているのかを見つけることができませんでした。しかし、あなたのおかげで、私はこの問題をなんとか修正することができました。新しいアクティビティで私がやっていることは何もないので、考えられる理由について誰かが何か光を投げかけることができれば素晴らしいと思います。
Shubhral

2
重要な注意:これは、スクロールビュー自体ではなく、LinearLayout内部にプロパティとして追加されますScrollView
Boris Strandjev

@BorisStrandjev非常に重要なメモ。回答に追加する必要があります。ちなみに、それをありがとう:P
Coreggon

それは文字通り答えで言及されています。
devmiles.com

35

レイアウトの項目を汚染する代わりに、これをアクティビティ/クラスに追加できます:

    ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView);
    scrollView.setFocusableInTouchMode(true); 
    scrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);

このように、フォーカスを取得するscrollView内の要素ではありません。これは、最初のフォーカスを取得するコンテナとしてのscrollViewであり、この後に子ビューに移動します。


ScrollView内の子に基づいてListViewの高さを設定しようとすると、部分的に動作します
Konstantin Konopko

これは役に立ちました!(一方、xmlの同じ属性は機能しませんでした。)
Matan Dahan

魅力的な作品!THX
Bogy

それは私のために機能しましたが、私はこの行を追加しました:scrollView.fullScroll(ScrollView.FOCUS_UP)どちらも個別に機能しませんでした。
ファンジョレロ

3

あなたはこのコードを試すことができます:

scroller.post(new Runnable() { 
    public void run() { 
        scroller.fullScroll(ScrollView.FOCUS_DOWN); 
    } 
}); 

[N:B] [参照リンク] 1


1
その良いオプションが、それは私が考える優れたユーザーエクスペリエンスではない開いた後ジャークをシミュレート
iBabur

2

devmiles.comが言ったことと一緒に。

LinearLayout-android:focusableInTouchMode = "true"で次のプロパティを設定すると、LinearLayoutは開始にフォーカスされ、アクティビティは下部のEditTextにスクロールしません。

線形レイアウトの下部にあるビューでrequestLayout()を呼び出すと、最上位のビューからフォーカスが奪われる可能性があります。したがって、下のビューでrequestLayout()を呼び出した後、線形レイアウトの一番上のビューでrequestFocus()を呼び出すだけです。


1

fullScrollメソッドを使用してみましたか?http://developer.android.com/reference/android/widget/ScrollView.html#fullScroll(int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP);

1

Xamarin Android開発で@Graemeソリューションを実行する場合:

// Set Focus to ScrollView
ScrollView scrollView = (ScrollView)FindViewById(Resource.Id.scrollView);
scrollView.FocusableInTouchMode = true;
scrollView.DescendantFocusability = Android.Views.DescendantFocusability.BeforeDescendants;

1

onCreate()でフォーカスできないようにしてください

editText.setFocusable(false);

そして使用する

editText.setOnClickListener(new ....){
 ......
  editText.setFocusable(true);
  editText.setFocusableInTouchMode(true);
  editText.requestFocus();

  showSoftKeyboard(); //Use InputMethodManager to open soft Keyboard

 ......
 };

次回はEdittextまでスクロールダウンせず、フラグメントまたはアクティビティが作成されます。



0

理由はわかりませんが、実験できます

ScrollView sv = (ScrollView) findViewById(R.id.scroll);
sv.scrollTo(0,0);

あなたにonCreateそれのようになり、どこにそれをスクロールし、手動にします。


0

scrollView.requestFocus(View.FOCUS_UP)トップビューが見えるようにしたいときに私の問題を解決しました。メソッドに方向パラメーターを指定requestFocus(int direction)すると、ScrollView位置を制御できます。詳細はこちら


0

私の場合、VideoView内部にConstraintLayout内部がありましたScrollView。これVideoViewは常にフォーカスを盗むものでしたが、それには問題があります。解決策はを使用することTextureViewです。うまくいけば、これは誰かを助けるでしょう、それは私に少なくとも1時間かかります:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.