쾌락코딩

Android this and that

|

Drawable 가져오기

getString을 제외하고는 Context 에서 ContextCompat으로 바뀌었다.

ContextCompat.getDrawable(context, R.drawable.blabla)

Color 가져오기

ContextCompat.getColor(context, R.color.colorBlabla)

하나의 문자열 마음대로 꾸미기

SpannableString 문자열 하나를 두고서 앞, 중간, 뒤에 이미지를 넣거나 특정 서브 스트링에 스타일링을 할 수 있다.

DataBinding + String resource + Html

resource + html

<string name="my_text"><![CDATA[<font color=#FF7815>안녕하세요.</font>]]>안드로이드 개발자입니다.</string>

layout xml + databinding

<data>
    <import type="androidx.core.text.HtmlCompat" />
</data>
....
<TextView
    ...
     android:text="@{HtmlCompat.fromHtml(@string/receive_this_month_info1, HtmlCompat.FROM_HTML_MODE_COMPACT)}"
    ...
/>
</TextView>

Recycler view

패딩값 설정

android:clipToPadding

  • android:clipToPadding 속성 리사이클러뷰의 크기를 줄이지 않고, 랜더링되기 전에 시작과 끝에 패딩값을 넣어 줄 수 있다.
layoutManager xml에서 관리
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem
tools:listitem="@layout/list_item_garden_planting"

listviewrecycler뷰에서 tools:listitem 속성이 실제 프로덕션에서 영향을 미치진 않는다. 다만 해당 리사이클러뷰의 각 item list의 뷰(레이아웃)을 바로 찾아갈 수 있고, 개발 도중 일종의 미리보기처럼 볼 수 있다.

Drwable Layout

android:fitsSystemWindows = true 옆에서 슬며시 나오는 뷰가 status bar와 키보드 영역을 덮지 않음을 설정하는 부분. true라면 status바를 덮지 않는다.

Databinding

finish Activity
...
<import type="android.app.Activity"/>
...
<ImagaeView
    android:onClick="@{(view) -> ((Activity)(view.getContext())).finish()}" />
...
@string databinding

@string 파일에 아래와 같이 작성

<string name="planted_date" translation_description="식물 심은 날짜 표기">%1$s planted on %2$s</string>

%1$s%2$s는 각각 첫 번째 스트링으로 대체될 부분, 두 번째 스트링으로 대체될 부분을 뜻한다. 이들을 xml에서 databinding으로 적용하는 코드는 아래와 같다.

<TextView
    android:id="@+id/plant_date"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="@{@string/planted_date(viewModel.plantName, viewModel.plantDateString)}" />

Tools

tools:layout
<fragment
    ...
    tools:layout="@layout/fragment_view"
    ...
>

디자인 탭에서 액티비티 xml 내에 fragment는 보통 회색으로 보여진다. 그러나 tools:layout을 사용하면 Fragment의 내용도 함께 보여진다.

Material

툴바 좌측에 홈 or 상위 화면으로 이동하는 버튼 노출시키기
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        supportActionBar?.setDisplayHomeAsUpEnabled(true) // <- 이 부분
        ...
}

override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        when (item?.itemId) {
            android.R.id.home -> onBackPressed()
        }
        return super.onOptionsItemSelected(item)
    }}

style

statusBar color와 statusBar icon들의 색상 변경

<style name="DarkStatusDialog" parent="ThemeOverlay.AppCompat.Dark">
    <item name="android:statusBarColor">@color/colorStatusBarBackground</item>
    <item name="android:windowLightStatusBar">false</item>
</style>

statusBarColor로 status bar의 배경색을 지정하고, windowLightStatusBar로 밝음 색임을 알려주면 icon 색상이 어둡게 나타난다.

적용할 view Class에서 아래와 같이 적용해줌.

init {
    setStyle(STYLE_NO_TITLE, R.style.DarkStatusDialog)
}

ScrollView

SrollView 내부의 중간 내용물이 적어도, 특정 뷰를 레이아웃 하단에 고정시키고 싶은 경우 키워드 -> fillViewport=true

ImageView

이미지의 가로세로 비율에 따라 크기를 조절해주는 키워드 -> android:adjustViewBounds = true

Glide4

Glide4 에서 이미지 Border 간단하게 처리하기

GlideApp.with(context).load("imageUrl")
            .transform(RoundedCorners(50))
            .into(imageView)

리사이클러뷰와 동적 높이를 가진 이미지 랜더링

아래와 같이 설정하면 채팅과 같이 동적인 비율의 이미지가 많이 랜더링 되는 화면에서 버벅임 없이 비율에 맞게 이미지가 표시된다. (이미지 가로를 고정하고, 높이를 wrap_content로 주었을 땐 심하게 버벅임이 일어난다.)

GlideApp.with(context)
        .load("imageUrl")
        .override(500, 500)
        .into(imageView)
<androidx.appcompat.widget.AppCompatImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:background="@color/transparent"
    android:maxWidth="200dp"
    android:maxHeight="400dp"
/>

Comments