ScrollView

안드로이드/Layout 2019. 12. 20. 21:57
728x90

Android Layout 을 작성하다보면 종종 ScrollView를 사용하는 경우가 있다. ScrollView는 길어지는 높이로 인해 화면에서 일부 View가 잘리는 현상을 상하 스크롤을 통해 해소할 수 있는 View이다.

 

주의할점: 스크롤뷰에는 단 하나의 자식 View만 포함되어야 한다!!
그래서, 여러개의 View를 넣으려면 스크롤뷰 안에 LinearLayout(
리니어레이아웃) 또는 RelativeLayout 등의 ViewGroup을 자식 View로 지정하고 그 안에 다양한 View를 넣는 구조를 택하여 해결할 수 있다.

 

<ScrollView
    android:id="@+id/scrollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity ="center"
    android:fillViewport="true"
    android:layout_marginTop="0dp"
    android:background="#000000">
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
 
        <TextView
            android:id="@+id/info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:gravity="left"
            android:textColor="#FFFFFF"/>
 
        <TextView
            android:id="@+id/consoleText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:ellipsize="start"
            android:gravity="left"
            android:textColor="#FFFFFF"
            android:textStyle="bold" />
    </LinearLayout>
</ScrollView> 

 

아래 코드는 콘솔 앱에 사용된 코드 일부이다.

 

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    Context mContext;
    TextView mTitleTextView;
    TextView mDumpTextView;
    ScrollView mScrollView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = MainActivity.this;
        initView();
    }
    private void initView() {
        mTitleTextView = (TextView) findViewById(R.id.info);
        mDumpTextView = (TextView) findViewById(R.id.consoleText);
        mScrollView = findViewById(R.id.scrollview);
        mScrollView.setVerticalScrollBarEnabled(true); // 수직방향 스크롤바 사용 가능하도록 설정
        mDumpTextView.setMovementMethod(new ScrollingMovementMethod());
        mDumpTextView.setTextSize(Constants.mTextFontSize);
        mDumpTextView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                mDumpTextView.setTextIsSelectable(true); // 복사 가능
                mDumpTextView.setCursorVisible(true);
                SpannableString highlightString = new SpannableString(mDumpTextView.getText());
                highlightString.setSpan(new BackgroundColorSpan(ContextCompat.getColor(mContext, R.color.mediumspringgreen))
                        , 0, mDumpTextView.getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                return false;
            }
        });
        mDumpTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDumpTextView.setTextIsSelectable(true); // 복사 가능
                mDumpTextView.setCursorVisible(false);
            }
        });
    }
    private void updateReceivedData(String data) {
        final String message = data;
        mDumpTextView.setTextColor(Color.WHITE);
        mDumpTextView.append(message);
        mDumpTextView.setTextIsSelectable(false); // 텍스트 클립보드 복사
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mDumpTextView.setElegantTextHeight(true);
        }
        mDumpTextView.setImeOptions(EditorInfo.IME_FLAG_NO_ENTER_ACTION);
        mDumpTextView.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
        mDumpTextView.setSingleLine(false);
        refreshView();
    }
    private void refreshView(){
        mScrollView.postDelayed(new Runnable() {
            @Override
            public void run() {
                mScrollView.fullScroll(ScrollView.FOCUS_DOWN);
            }
        },100);
        mScrollView.smoothScrollTo(0, mDumpTextView.getBottom());
    }

 

728x90

'안드로이드 > Layout' 카테고리의 다른 글

CardView Layout 예제  (0) 2020.04.12
Meterial Design 로그인 Layout 예제  (0) 2020.03.21
Dynamic Layouts  (0) 2019.01.06
Android Fragment 기본 예제  (0) 2018.09.11
FloatingActionButton(FAB)  (0) 2018.08.15
블로그 이미지

Link2Me

,