Android: ScrollView Issue
Your EditText should have a height of wrap_content
. fill_parent
has no meaning in a ScrollView
. If you want the EditText
to fill your ScrollView
when it's content is smaller than the ScrollView
, use android:fillViewport="true"
on the ScrollView
.
Android ScrollView layout problem
I'm interested in that topic too, so I did a bit of research. First: Never put a ListView in a ScrollView (as you found out yourself). Unfortunately googling this problem doesn't lead to any solutions, so I tried my suggestion from my comment above.
I implemented a custom ListAdapter and put the ListViews into one parent ListView. This doesn't work (leads to the same problem as with a ScrollView). Speaking to the guys on the official android-irc #android-dev on freenode, they told me that putting ListViews into a ListView is as bad as or even worse than putting them into a ScrollView. Unfortunately they also couldn't help me with the problem.
There seems to be only one way to achieve what you want to do; see the answer on this similar question Scrolling with Multiple ListViews for Android . The idea is to merge all ListViews into a single one by a custom adapter and to insert some kind of headers between entries. This is absolutely doable but might require some special effort.
Android Scrollview layout issue
You can use android:descendantFocusability attribute to control that descendants of ScrollView
should get focus or not. If you want that the ScrollView
should not scroll down automatically then set the value of android:descendantFocusability
attribute to blocksDescendants
and add this attribute to the LinearLayout
which is the child of ScrollView
.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:orientation="vertical"
android:descendantFocusability="blocksDescendants" >
XML Layout weight not working in a ScrollView on android API23
One should understand how dimensions are calculated.
Let's look one by one.
1) ScrollView
is fill_parent
/fill_parent
(actually one can change this to match_parent
/match_parent
as fill_parent
is deprecated as far as I remember, but it doesn't matter in this case).
So, ScrollView
is shown fits whole screen (width and height).
2) LinearLayout
inside ScrollView
is match_parent
/wrap_content
. And that is correct. One should use wrap_content
for views that inside ScrollView
.
The reason why - is that ScrollView
is used to wrap long views with usually unknown height (like lists). Imagine here match_parent
as height - height of LinearLayout
would be calculated based on height of scroll view, which is whole screen height, and LinearLayout
height can be greater that screen height. Just not logical. But everything is OK till now. Move on.
3) Items inside LinearLayout
. You want them to be 1/10
and 9/10
of height of parent layout. Also, you set height
for inner items to 0
to show that you want height to be calculated from weights
.
And here you got a cycle of dependencies. LinearLayout
height is wrap_content
and depends on sum of heights of inner elements.
And inner elements' height is calculated from parent LinearLayout
height.
Additionally, you want ImageView
to be 1/10 of the LinearLayout
height. But actually seems like you want ImageView
to be 1/10
of the screen's height, as LinearLayout
height can be greater than screen's height (and looks like this is what you get on your device).
You say, that everything is OK in preview in Android Studio.
To demonstrate that not everything is OK try this:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:fillViewport="true"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_weight="1"
android:adjustViewBounds="true"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:id="@+id/image"
android:scaleType="fitCenter"
android:src="@drawable/bjj2" />
<LinearLayout
android:layout_weight="10"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp">
<View
android:layout_width="match_parent"
android:layout_height="1000dp"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
Just put some big (bigger than screen's height) view inside your inner-inner LinearLayout
and you will see that in preview your image is bigger than 1/10
of screen's height. But it is 1/10
of LinearLayout
's height.
How to solve your issue?
I think the only way is to calculate 1/10
of the screen's height and resize bitmap with image you want to have and set that bitmap to ImageView
.
Or any other way to set exact height to ImageView
.
Or review your layout and create something different.
ScrollView not scrolling at all
Answer: the ScrollView is not working when used as the root element of an XML layout. It has to be wrapped inside a LinearLayout.
Solution then :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ScrollView android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true" >
<LinearLayout android:id="@+id/scroll_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
</LinearLayout>
ScrollView not sizing itself correctly
What you can do, is to correct the height in your code. It's a bit hacky and I would like to see another solution, but off the top of my head I do not know anything better.
What you would need is to add a OnGlobalLayoutListener
and calculate within it the minimum of either the ScrollView
height or the height of the container surrounding your ScrollView
minus the height of your Button
.
Then set the size with setLayoutParams()
on your ScrollView
.
And you have to remove the listener to avoid an endless loop :-)
final View scrollview = findViewById(R.id.scrollview);
final View container = findViewById(R.id.container);
final View button = findViewById(R.id.button);
scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int height = scrollview.getHeight();
int heightButton = button.getHeight();
int heightContainer = container.getHeight();
int min = Math.min(heightContainer - heightButton, height);
int width = scrollview.getWidth();
Log.v("test", "min: " + min);
scrollview.setLayoutParams(new RelativeLayout.LayoutParams(width, min));
// do not forget to remove the listener
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
scrollview.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
else {
scrollview.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
For this to work you have to use wrap_content
as the height of the ScrollView
in your layout file. And the outer container has to be a RelativeLayout
so that the Button
is rendered and has a non-zero height!
If you use paddings or margins you would have to consider those values in the computation.
Related Topics
Alarmmanager Android Every Day
Android: Create Circular Image with Picasso
What Is the Default Font Family in Android
Eclipse, Android, Scala Made Easy But Still Does Not Work
How to Replace Deprecated Android.Support.V4.App.Actionbardrawertoggle
Facebook Authentication Without Login Button
Can You Launch the Native Camera App from an HTML 5 Web App
App Not Setup: This App Is Still in Development Mode
Official "Boost Library" Support for Android and iOS
Display Huge Images in Android
Android Webview with Client Certificate
Dynamic Contents in Maps V2 Infowindow
How to Play Local Swf Files in a Webview
Get Context Inside Onclick(Dialoginterface V, Int Buttonid)