Android에서 텍스트 뷰를 스크롤 할 수 있습니다
문제
하나의 화면에 맞지 않는 텍스트 뷰에 텍스트를 표시하고 있습니다. 텍스트 뷰를 스크롤 할 수 있도록해야합니다. 어떻게 할 수 있습니까?
코드는 다음과 같습니다.
final TextView tv = new TextView(this);
tv.setBackgroundResource(R.drawable.splash);
tv.setTypeface(face);
tv.setTextSize(18);
tv.setTextColor(R.color.BROWN);
tv.setGravity(Gravity.CENTER_VERTICAL| Gravity.CENTER_HORIZONTAL);
tv.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent e) {
Random r = new Random();
int i = r.nextInt(101);
if (e.getAction() == e.ACTION_DOWN) {
tv.setText(tips[i]);
tv.setBackgroundResource(R.drawable.inner);
}
return true;
}
});
setContentView(tv);
해결책
사용할 필요가 없습니다 ScrollView
실제로.
그냥 설정하십시오
android:scrollbars = "vertical"
당신의 속성 TextView
레이아웃의 XML 파일에서.
그런 다음 사용하십시오 :
yourTextView.setMovementMethod(new ScrollingMovementMethod());
코드에서.
빙고, 스크롤!
다른 팁
이것이 XML에서 순전히 한 방법입니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ScrollView
android:id="@+id/SCROLLER_ID"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:fillViewport="true">
<TextView
android:id="@+id/TEXT_STATUS_ID"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"/>
</ScrollView>
</LinearLayout>
메모:
android:fillViewport="true"
결합android:layout_weight="1.0"
TextView가 사용 가능한 모든 공간을 차지하게됩니다.ScrollView를 정의 할 때는 지정하지 마십시오
android:layout_height="fill_parent"
그렇지 않으면 스크롤 뷰가 작동하지 않습니다! (이로 인해 지금 한 시간을 낭비하게되었습니다! FFS).
프로 팁 :
텍스트를 추가 한 후 프로그래밍 방식으로 하단으로 스크롤하려면 다음을 사용하십시오.
mTextStatus = (TextView) findViewById(R.id.TEXT_STATUS_ID);
mScrollView = (ScrollView) findViewById(R.id.SCROLLER_ID);
private void scrollToBottom()
{
mScrollView.post(new Runnable()
{
public void run()
{
mScrollView.smoothScrollTo(0, mTextStatus.getBottom());
}
});
}
실제로 필요한 것은 setMovementMethod ()입니다. 다음은 LinearLayout을 사용하는 예입니다.
파일 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/tv1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"
/>
</LinearLayout>
파일 WordExtractTest.java
public class WordExtractTest extends Activity {
TextView tv1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv1 = (TextView)findViewById(R.id.tv1);
loadDoc();
}
private void loadDoc() {
String s = "";
for(int x=0; x<=100; x++) {
s += "Line: " + String.valueOf(x) + "\n";
}
tv1.setMovementMethod(new ScrollingMovementMethod());
tv1.setText(s);
}
}
이것을 추가하는 것만으로 텍스트 뷰를 만드십시오
TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
들어갈 필요는 없습니다
android:Maxlines="AN_INTEGER"`
간단히 추가하여 작업을 수행 할 수 있습니다.
android:scrollbars = "vertical"
그리고이 코드를 Java 클래스에 넣습니다.
textview.setMovementMethod(new ScrollingMovementMethod());
당신도 할 수 있습니다
- 둘러싸
TextView
aScrollView
; 또는 - 이동 방법을 설정하십시오
ScrollingMovementMethod.getInstance();
.
내가 찾은 가장 좋은 방법 :
TextView를 EditText로 이러한 추가 속성으로 바꾸십시오.
android:background="@null"
android:editable="false"
android:cursorVisible="false"
스크롤 뷰에서 포장이 필요하지 않습니다.
XML 만 사용하여 "TextView에 스크롤 바를 적용하는 방법"입니다.
먼저, 텍스트 뷰 컨트롤을 main.xml 파일을 제출하고 텍스트를 작성하십시오.
<TextView
android:id="@+id/TEXT"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/long_text"/>
다음으로 텍스트보기 컨트롤을 스크롤 뷰 사이에 배치 하여이 텍스트의 스크롤 막대를 표시합니다.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<ScrollView
android:id="@+id/ScrollView01"
android:layout_height="150px"
android:layout_width="fill_parent">
<TextView
android:id="@+id/TEXT"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/long_text"/>
</ScrollView>
</RelativeLayout>
그게 다야 ...
단순한. 이것이 내가 한 방법입니다.
XML 측 :
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" tools:context="com.mbh.usbcom.MainActivity"> <TextView android:id="@+id/tv_log" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="vertical" android:text="Log:" /> </RelativeLayout>
자바 측 :
tv_log = (TextView) findViewById(R.id.tv_log); tv_log.setMovementMethod(new ScrollingMovementMethod());
보너스:
텍스트보기가 텍스트를 채우면 아래로 스크롤하려면 다음을 추가해야합니다.
android:gravity="bottom"
TextView XML 파일에 더 많은 텍스트가 들어 오면 자동으로 아래로 스크롤됩니다.
물론 설정 텍스트 대신 Append 함수를 사용하여 텍스트를 추가해야합니다.
tv_log.append("\n" + text);
로그 목적으로 사용했습니다.
이게 도움이 되길 바란다 ;)
어딘가에있는 누군가의 위의 "프로 팁"(Android에서 텍스트 뷰를 스크롤 할 수 있습니다) 그러나 잘 작동하지만 스크롤 뷰에 텍스트를 동적으로 추가하고 추가 후 하단으로 스크롤하려면 어떻게해야합니까? 뿐 사용자가 스크롤 뷰의 맨 아래에있을 때? (아마도 사용자가 스크롤하여 내용을 읽었을 때 부록 중에 자동으로 하단으로 재설정하고 싶지 않아 성가시기 때문일 수 있습니다.)
어쨌든 여기에 있습니다.
if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <=
(mScrollView.getHeight() + mTextStatus.getLineHeight())) {
scrollToBottom();
}
mtextStatus.getLineHeight ()는 사용자가 스크롤 뷰의 끝에서 한 줄 내에있는 경우 스크롤 작업 ()을 스크롤 트토 봇 톰 ()하지 않도록 만듭니다.
이것은 스크롤 막대와 함께 부드러운 스크롤 텍스트를 제공합니다.
ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);
TextView 내에서 텍스트를 스크롤하려면 다음을 따를 수 있습니다.
먼저 텍스트 뷰를 서브 클래스해야합니다.
그리고 그것을 사용하십시오.
다음은 서브 클래스 텍스트 뷰의 예입니다.
public class AutoScrollableTextView extends TextView {
public AutoScrollableTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setEllipsize(TruncateAt.MARQUEE);
setMarqueeRepeatLimit(-1);
setSingleLine();
setHorizontallyScrolling(true);
}
public AutoScrollableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
setEllipsize(TruncateAt.MARQUEE);
setMarqueeRepeatLimit(-1);
setSingleLine();
setHorizontallyScrolling(true);
}
public AutoScrollableTextView(Context context) {
super(context);
setEllipsize(TruncateAt.MARQUEE);
setMarqueeRepeatLimit(-1);
setSingleLine();
setHorizontallyScrolling(true);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
if(focused)
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
@Override
public void onWindowFocusChanged(boolean focused) {
if(focused)
super.onWindowFocusChanged(focused);
}
@Override
public boolean isFocused() {
return true;
}
}
이제 XML에서 이런 식으로 사용해야합니다.
<com.yourpackagename.AutoScrollableTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is very very long text to be scrolled"
/>
그게 다야.
나는 '플링'제스처를 지원하기 위해 TextView 스크롤을 찾지 못했습니다. 여러 가지 이유로 스크롤 뷰를 사용하고 싶지 않았기 때문에 직접 구현하게되었으며, 텍스트를 선택하고 링크를 클릭 할 수있는 움직임 방법이없는 것 같습니다.
XML의 TextView에 다음을 추가하십시오.
android:scrollbars="vertical"
마지막으로 추가하십시오
textView.setMovementMethod(new ScrollingMovementMethod());
Java 파일에서.
스크롤 가능성이 완료되면보기에 무엇이든 입력 할 때이 줄을 뷰의 마지막 줄에 추가하십시오.
((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);
이것을 XML 레이아웃에 추가하십시오.
android:ellipsize="marquee"
android:focusable="false"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:text="To Make An textView Scrollable Inside The TextView Using Marquee"
코드에서 다음 줄을 작성해야합니다.
textview.setSelected(true);
textView.setMovementMethod(new ScrollingMovementMethod());
EditText 솔루션을 사용하지 않으려면 다음과 같은 운이 좋을 수 있습니다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.yourLayout);
(TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance());
}
아래 코드는 자동 수평 스크롤 텍스트 뷰를 만듭니다.
XML 사용에 TextView를 추가하는 동안
<TextView android:maxLines="1"
android:ellipsize="marquee"
android:scrollHorizontally="true"/>
oncreate ()에서 다음 텍스트 뷰 속성을 설정하십시오.
tv.setSelected(true);
tv.setHorizontallyScrolling(true);
이렇게 사용하십시오
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxLines = "AN_INTEGER"
android:scrollbars = "vertical"
/>
Kotlin에서 TextView를 스크롤 할 수 있도록합니다
myTextView.movementMethod= ScrollingMovementMethod()
또한이 속성을 XML에 추가하십시오
android:scrollbars = "vertical"
제 경우에는 제약 레이아웃이 2.3입니다.
코드 구현 :
YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());
XML :
android:scrollbars="vertical"
android:scrollIndicators="right|end"
놓다 maxLines
그리고 scrollbars
XML의 텍스트 뷰 내부.
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:maxLines="5" // any number of max line here.
/>
그런 다음 Java 코드로.
textView.setMovementMethod(new ScrollingMovementMethod());
사용했을 때이 문제가있었습니다 TextView
내부 ScrollView
. 이 솔루션은 저에게 효과적이었습니다.
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
description.getParent().requestDisallowInterceptTouchEvent(false);
return false;
}
});
description.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
description.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
필요할 때마다 ScrollView를 부모로 사용하십시오, 또한 TextView와 함께 스크롤 이동 방법을 사용합니다.
그리고 당신이 시간이 발생하는 기기 조경에 대한 초상화 몇 가지 문제가 발생합니다.. (좋아요) 전체 페이지는 스크롤 가능하지만 스크롤 이동 방법은 작동 할 수 없습니다.
ScrollView를 부모 또는 스크롤 이동 방법으로 사용해야하는 경우 DESC 아래에서도 사용합니다.
문제가 없으면 TextView 대신 editText를 사용합니다.
아래를 참조하십시오 :
<EditText
android:id="@+id/description_text_question"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:editable="false"
android:cursorVisible="false"
android:maxLines="6"/>
여기에서 edittext는 TextView처럼 작동합니다
그리고 당신의 문제는 해결 될 것입니다
XML- 사용할 수 있습니다 android:scrollHorizontally
기인하다
텍스트가보기보다 넓어 지는지 여부 (따라서 가로로 스크롤 될 수 있음).
"true"또는 "false"와 같은 부울 가치 일 수 있습니다.
Prigramacaly- setHorizontallyScrolling(boolean)
이 시도:
android:scrollbars = "vertical"
나는 일주일 이상 이것으로 어려움을 겪고 마침내이 일을하는 방법을 알아 냈습니다!
내 문제는 모든 것이 '블록'으로 스크롤한다는 것입니다. 텍스트 자체는 스크롤되었지만 줄별로 라인이 아닌 청크로 사용되었습니다. 이것은 바닥에서 선을 잘라 내기 때문에 분명히 나에게 효과가 없었습니다. 이전의 모든 솔루션은 나에게 효과가 없었으므로 내 자신을 만들었습니다.
가장 쉬운 솔루션은 다음과 같습니다.
패키지 내부에서 'PerfectScrollableTextView'라는 클래스 파일을 만든 다음이 코드를 복사하여 다음에 붙여 넣습니다.
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;
public class PerfectScrollableTextView extends TextView {
public PerfectScrollableTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setVerticalScrollBarEnabled(true);
setHorizontallyScrolling(false);
}
public PerfectScrollableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
setVerticalScrollBarEnabled(true);
setHorizontallyScrolling(false);
}
public PerfectScrollableTextView(Context context) {
super(context);
setVerticalScrollBarEnabled(true);
setHorizontallyScrolling(false);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
if(focused)
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
@Override
public void onWindowFocusChanged(boolean focused) {
if(focused)
super.onWindowFocusChanged(focused);
}
@Override
public boolean isFocused() {
return true;
}
}
마지막으로 XML에서 'TextView'를 변경하십시오.
에서: <TextView
에게: <com.your_app_goes_here.PerfectScrollableTextView