每当我开始这项活动时,它总是从最低点开始 - 一直向下滚动到底部。我没有在活动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>
答案 0 :(得分:287)
当Android启动活动时,某些控件需要关注。当没有指定的控件来获得焦点时,系统会选择第一个需要焦点的合格控件。
如果您在LinearLayout中设置了以下属性 - android:focusableInTouchMode="true"
,您的LinearLayout
将专注于开始,而您的活动不会滚动到底部的EditText
。
答案 1 :(得分:29)
您可以将其添加到您的活动/类中,而不是污染布局中的项目:
ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView);
scrollView.setFocusableInTouchMode(true);
scrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
这样,你的scrollView中的元素不会得到焦点,它是你的scrollView作为第一个焦点的容器,在此之后移动到子视图之后
答案 2 :(得分:3)
您可以尝试以下代码:
scroller.post(new Runnable() {
public void run() {
scroller.fullScroll(ScrollView.FOCUS_DOWN);
}
});
[N:B] [参考链接] 1
答案 3 :(得分:2)
与devmiles.com所说的一样。
如果在LinearLayout中设置以下属性 - android:focusableInTouchMode =“true”,您的LinearLayout将专注于开始,您的活动将不会滚动到底部的EditText。
如果您在线性布局底部的视图上调用requestLayout(),则可能会从最顶层的视图中窃取焦点。因此,在较低视图上调用requestLayout()之后,只需在线性布局中的最顶层视图上调用requestFocus()。
答案 4 :(得分:1)
您是否尝试过使用fullScroll方法?http://developer.android.com/reference/android/widget/ScrollView.html#fullScroll(int)
yourScrollView.fullScroll(ScrollView.FOCUS_UP);
答案 5 :(得分:1)
对于Xamarin Android开发,如果你想做@Graeme解决方案,那么:
// Set Focus to ScrollView
ScrollView scrollView = (ScrollView)FindViewById(Resource.Id.scrollView);
scrollView.FocusableInTouchMode = true;
scrollView.DescendantFocusability = Android.Views.DescendantFocusability.BeforeDescendants;
答案 6 :(得分:1)
让它在onCreate()
中无法集中注意力editText.setFocusable(false);
并使用
editText.setOnClickListener(new ....){
......
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();
showSoftKeyboard(); //Use InputMethodManager to open soft Keyboard
......
};
下次不会向下滚动到Edittext,会创建一个片段或活动。
答案 7 :(得分:0)
我不知道为什么,但你可以试验
ScrollView sv = (ScrollView) findViewById(R.id.scroll);
sv.scrollTo(0,0);
在onCreate
中手动将其滚动到您喜欢的位置。
答案 8 :(得分:0)
scrollView.requestFocus(View.FOCUS_UP)
解决了我希望看到顶视图时遇到的问题。
为方法requestFocus(int direction)
指定方向参数是控制ScrollView
位置的好方法。更多详细信息here。
答案 9 :(得分:0)
在您的 ScrollView
android:focusableInTouchMode="true"
android:descendantFocusability="blocksDescendants"
答案 10 :(得分:0)
在我的情况下,我在VideoView
内的ConstraintLayout
内有一个ScrollView
。 VideoView
总是在抢夺焦点,而there are issues with it。解决方案是使用TextureView
。希望这对某人有帮助,至少花了我一个小时:)
答案 11 :(得分:0)
使用 Kotlin
和 ViewBinding
,您可以将其添加到您的 fragment
或 activity
中:
binding.mainScroll.isFocusableInTouchMode = true
binding.mainScroll.descendantFocusability = ViewGroup.FOCUS_BEFORE_DESCENDANTS