TextView within a scroll view - android

I'm having a bit of an issue with a text view embedded within a scroll view. When the text becomes 4 lines or so, I'm unable to scroll to the top line of the text - although I can scroll to one line past the last line of the text.
Here's the layout:
<ScrollView android:layout_width="wrap_content"
android:layout_height="90sp"
android:scrollbars="vertical">
<TextView android:id="#+id/display_english"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dp" android:layout_gravity="center_vertical|center_horizontal"
android:textSize="30sp" android:textColor="#color/text_color" />
</ScrollView>
Any thoughts?

If you're just trying to make your TextView scrollable, then you do not need to embed it in a ScrollView. I would check out this solution.

After extensively reviewing this problem in code and online, currently the only viable solutions to get a TextView to scroll vertically inside a ScrollView appear to be:
1) If a vertically-oriented layout isn't absolutely necessary, change the containing ScrollView to a HorizontalScrollView and arrange its children (including the scrollable TextView) in a horizontal orientation. This way, the horizontal scrolling of the HorizontalScrollView will not interfere with the vertical scrolling of the TextView.
2) If a vertically-oriented layout IS absolutely necessary, don't try to get the TextView to scroll vertically inside a vertical ScrollView, at all. Instead, set the height of the TextView to "WRAP_CONTENT", since this will ensure the content of the TextView will be visible in its entirety without scrolling. This works, because you are not concerned with the absolute height of the child-layout, since you want to use a vertical ScrollView in the first place.

Related

Android TV: Focus moved to View in ScrollView that is outside visible part of ScrollView

I have a vertical row of focusable Views inside a ViewGroup in a ScrollView.
Above it are some focusable buttons.
When the ScrollView has views scrolled up outside it's top, and I move focus horizontally between the buttons, the views in the scroll view ABOVE the visible part of the the scrollview get focus, since they are in the same horizontal area as the buttons I guess.
This seems like very incorrect behaviour.
Is anybody else seeing this behaviour or know of a way to avoid it?
Since you did not add your code, I can only suggest adding the following attributes to your buttons:
<Button
android:id="#+id/button1"
android:nextFocusRight="#+id/button2"
... />
<Button
android:id="#id/button2"
android:nextFocusLeft="#id/button1"
... />
You can get more information here:
https://developer.android.com/training/keyboard-input/navigation#Direction

ListView inside two LinearLayout and scrolling issue

I have this structure
<LinearLayout
android:id="#+id/1">
<LinearLayout
android:id="#+id/2" />
<LinearLayout
android:id="#+id/3">
<ListView
android:id="#android:id/list" />
</LinearLayout>
</LinearLayout>
And I populate the ListView with some data. Well my problem is that the ListView becomes scrollable (while the LinearLayout number 1 fits the screen without scrolling), but what I want is this View to become full height and that the LinearLayout with id=1 becomes scrollable.
Inside ListView number 2 I have some TextViews, etc.
ListView's are scrollable by default if when the content is more than its display area.
However, LinearLayout would need to have a ScrollView in order to scroll.
Red Alert - You cannot use ScrollView and ListView together. You will end up seeing un-expected.
Alternate Solution: Prioritize what is more important to you, if scrolling the entire screen then add a ScrollView (provided your ListView items are static) else I will to wait to hear a good solution on this one. :)
Add ScrollView for ListView.
ScrollView will work for only one child view, so you have to add like this
LinearLayout
LinearLayout
LinearLayout
ScrollView
ListView...../ListView
/ScrollView
/LinearLayout

How to make ListView and ImageView scrollable into LinearLayout?

I have LinearLayout compoment which contains ListView and ImageView.
According to the documentation layout area should be scrollable if element's height is bigger than LinearLayout's area.
But scroll is not available.
I can scroll only when listview contains a lot of elements. But in this case ImageView component is not visible at all.
Using ScrollView is not allowed because ListView has his own Scroll element.
Could you please advice what should I do?
Here is part of my xml file:
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="#id/top_header"
android:layout_above="#id/bottom_menu"
android:layout_weight="1"
android:id="#+id/sub_content_view">
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="#+id/eventsListView"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="260dp"
android:id="#+id/empty_area"
android:adjustViewBounds="true"
android:background="#drawable/empty_area"
android:contentDescription="#string/contentDescription"/>
</LinearLayout>
If you ListView is not empty, you may register the ImageView as list footer, it then scrolls with the ListView. However, footers are not displayed if the list is empty, so you'd have to add the ImageView to the empty view as well.
First 2 comments than a possible solution
(1) ListView won't be scrollable when there's nothing in it. Instead it will display an empty view which you can set either programaticlly or with XML (usualy a text view that says something to the extent of "your list is empty").
(2) Your ImageView is set for a fixed height while your ListView is set to wrap_content. As a result, when your ListView contains enough elements that is is larger than the area of the screen it will push your ImageView out of view. As I have yet to see a LinearLayout or RelativeLayout suddnely become scrollable if there's more stuff on the screen than there is space (I just tried to make it happen) I'm not surprised by what you're describing.
You're right that using a ScrollView with a ListView as a child is disfavored. What I would try is - instead of putting both the ListView and ImageView in the same LinearLayout - separate the two. I don't know the rest of your XML but if you moved the ImageView out of that layout element you should be able to position it below the part containing the ListView such that - regardless of the size of the list - the ImageView will remain in the same place.
The suggestion above to use a footer may work, however, a footer is pinned to the bottom of the list. That means, if your list is really long, there will be a point at which the footer is not visible unless you scroll down far enough that it is exposed. If you want the image to remain visible all the time, e.g. have the list scroll behind the image, then you need to use a different approach.

Layout troubles

I am having a spot of bother with a fairly simple layout. Here it is:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="#+id/id1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="end"
android:maxLines="1"/>
<TextView
android:id="#+id/id2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>
3 Questions:
How do I center vertical both TextViews (or perhaps better said, the text within those views) within the parent LinearLayout? The left view is vertically centered OK, but the right one (because it has a smaller font) is not. It seems to be centered vertically at the top. I obviously tried playing with layout_gravity of the second view but that makes no difference whatsoever. The only way I can solve it is to wrap the second TextView in a LinearLayout with its layout height parameter set to match_parent (but is this the correct way of doing this?)
Similarly, I want the View on the left horizontally centered on the left, and the View on the right horizontally centered on the right. Currently the right View is placed immediatly next to the left one. The only way I can solve this is by adding something like this inbetween the two text views:
<TextView
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="">
basically acting as a spacer which decreases in size depending on the legth of the text in both TextViews
I want the text in the left View to be truncated if the combined text of the Views does not fit horizontally. No wrapping onto a new line. Currently the text in the left View simply "pushes" the right one out of the parent. No idea how to achieve that (apart from adding android:maxLines="1" to stop the text from wrapping). I have tried android:ellipsize="end" but that does not seem to have any effect.
Best way is to use Relative layout , but still if you want to do the same thing in Linear layout than do some changes in your xml file
-First is set Linear layout hight as match parent :
<LinearLayout android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="horizonatal">
-Second for making the views visible at centre vertical do
android:layout_gravity="center_vertical"
same property android:layout_gravity = "center_horizontal" , you have to add in second text view also.
It will make your both text view appear at centre vertical but one next to other.
To make the second view appear on right I think you can add
android:layout_marginLeft="xx dp"
put some value in place of xx.
For your third question about truncating your text, you should give some size to your TextView not wrap content..Like android:layout_width ="25dp"
and then use android:ellipsize="end".
I guess you will get that..Actually I am in hurry,time to leave the office.

Scrollbar does not scroll while using dynamically filled listview

I am not able to scroll in a scrollview which contains a listview and is filled dynamically as I get data from the webservice.
I am able to do scrolling in emulator through mouse wheel, but in avtual device I can not scroll the list.
The attributes of scrollview are
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="10dp"
android:layout_weight="0.6"
android:fillViewport="true"
android:orientation="vertical"
android:padding="6.0dip"
android:scrollbarAlwaysDrawVerticalTrack="true"
android:scrollbarFadeDuration="5000"
android:scrollbarSize="20dp"
android:scrollbarStyle="insideOverlay"
android:scrollbars="vertical" >
<LinearLayout
android:id="#+id/linearLayout2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="2dp" >
<ListView
android:id="#+id/listbox_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="599.84"
android:minHeight="250dp" >
</ListView>
</LinearLayout>
</ScrollView>
Please help me soon
by just looking at the layout_width and layout_height of your elements, it's clear that your scrollview will not scroll. unless you have a fixed height listview, never put a listview inside a scrollview (or in this case, a listview inside a layout that sits inside a scrollview).
I don't have any links to back this up right now, but it's not possible, and a well-known 'problem'. If you google a bit, or search here on SO, you'll find a number of topics covering this.
The problem arises in most cases when you have a scrolling view inside another scrolling view in the same direction. Consider the following example:
You have Two lists inside of a ScrollView.
Both lists are exactly one screen tall.
How do you scroll down to the second list?
When scrolling, how will your layout know if you are scrolling the list or the container?
This is basically the question that is the cause, and the only official solution is that it is as it should be, and there won't be a fix. Usually it is enough to have either a ListView or a ScrollView, but I have faced cases when you must have a listview in a scrollview (in my case a client wanted an iPhone-like datespinner in a scrolling page).
I solved it by using a FrameLayout, containing a custom ScrollView, and a ListView on top of that. Then in the code for the custom ScrollView, I added a line in the onScroll method that updated the top margin of the ListView, to psuh it upwards or downwards as the user scrolled. Surprisingly it worked.
NOTE: remember that:
The ListView handles its own scroll. If all you need is a scrolling
list, you do not need a ScrollView.
If you need a layout with a list and space for buttons or other
views, consider creating your layout so that the list only covers
enough space for you to fit your other views below/above without
scrolling.
Add following in your linear layout
android:scrollbars="vertical"
android:scrollbarAlwaysDrawVerticalTrack="true"

Categories

Resources