728x90
반응형

이번에도 아주 핫 한 안드로이드 팁을 들고 왔습니다.


특히 ButterKnife를 쓰시는 분들이라면 더욱 잘 오셨습니다.


만약 ButterKnife에 대해 잘 모르시는 분은 박상권님 블로그에 설명이 잘 되어있으니 보시길 바랍니다.


이번에 소개해 드릴 것은 Android Studio Plugin으로 바로 이것입니다.


Android ButterKnife Zelezny라는 Plugin입니다.


간단하게 소개하자면 xml에서 만든 View들을 ButterKnife 라이브러리를 사용해서 자동으로 Injection해주는 것입니다.


말로는 잘 이해를 못하시겠죠?


그럼 아래를 보시죠


이렇게 Plugin을 설치한 후에 setContentView안에 있는 xml에 커서를 올리고 Generate -> Generate Butterknife Injection을 선택합니다.


그리고 BindView할 것들과 OnClick할 것을 선택하고 Confirm버튼을 누르면 알아서 ButterKnife.bind()도 해주고 @BindView, @OnClick까지 해준답니다.


또한 RecyclerView에 들어가는 ViewHolder도 만들어준답니다.



ButterKnife를 쓰는 저로써 findViewById()를 사용하지 않는것만해도 정말 좋은데 이런 plugin이 있으니까 정말 BufferKnife가 더 좋아지려고 합니다.

728x90
반응형
728x90
반응형

앱을 사용하다 보면 사용자에게 무엇 인가를 선택하게 만들어야하는 순간이 옵니다.


하지만 화면을 따로 만들거나 DialogFragment로 만들려면 다소 귀찮은게 한두가지가 아닙니다. ㅠㅠ


그래서 이번 포스팅에서는 아주 간단한 방법으로 selection popup을 만드는 것을 소개 하려고 합니다.


저는 지금까지 AlertDialog는 Message만 넣을 수 있는줄 알았습니다.


하지만 SingleChoice와 MultiChoice도 만들 수 있다는 것을 최근에 알았습니다.


먼저 layout은 기본으로 생성해주는 activity_main.xml을 사용하겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.googry.googryselectpopup.MainActivity">

<TextView
android:id="@+id/tv_sports"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>


SingleChoice는 AlertDialog에 setItems를 사용해 만들 수 있습니다.

setItems는 String[]나 CharSequence[]를 인자로 받습니다.

public class MainActivity extends AppCompatActivity {

private String[] mSports = {"야구","축구","농구","수영","테니스","골프","탁구","볼링","당구","태권도","유도","검도"};
private TextView mTvSports;
private AlertDialog mSportSelectDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mTvSports = (TextView) findViewById(R.id.tv_sports);
mTvSports.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSportSelectDialog.show();
}
});

mSportSelectDialog = new AlertDialog.Builder(MainActivity.this )
.setItems(mSports, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mTvSports.setText(mSports[i]);
}
})
.setTitle("title")
.setPositiveButton("확인",null)
.setNegativeButton("취소",null)
.create();

}
}

그리고 OnClickListener를 통해 선택된 아이템의 index를 넘겨 받게 됩니다.


실행 화면



MultiChoice는 AlertDialog에 setMultiChoiceItems를 사용해 만들 수 있습니다.


이 함수는 setItems와는 다르게 boolean[]를 추가로 받습니다.

그 이유는 이전에 선택된 것을 보여주기 위해서 입니다.

public class MainActivity extends AppCompatActivity {

private String[] mSports = {"야구","축구","농구","수영","테니스","골프","탁구","볼링","당구","태권도","유도","검도"};
private boolean[] mSportsSelected = new boolean[mSports.length];
private TextView mTvSports;
private AlertDialog mSportSelectDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mTvSports = (TextView) findViewById(R.id.tv_sports);
mTvSports.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSportSelectDialog.show();
}
});

mSportSelectDialog = new AlertDialog.Builder(MainActivity.this )
.setMultiChoiceItems(mSports, mSportsSelected, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
mSportsSelected[i] = b;
}
})
.setTitle("title")
.setPositiveButton("확인",null)
.setNegativeButton("취소",null)
.create();

}
}

그리고 OnMultiChoiceClickListener를 통해 아이템을 선택 할 때 마다 선택한 아이템의 index와 선택유무인 boolean을 넘겨 받게 됩니다.


실행화면



저는 지금까지 간단한 SingleChoice나 MultiChoice도 DialogFragment로 직접 만들어서 사용했는데 이런게 있는줄 너무 늦게 알았습니다.


여러분들도 간단한 입력은 이런식으로 처리하세요~~

728x90
반응형
728x90
반응형

구글은 Android 8.0 O버전을 Oreo로 공식 발표를 했습니다. 



이번 포스팅에서는 Oreo에서 추가된 새로운 기능들 중에 몇가지에 대해 소개 하려고 합니다.


- 알림

Android 8.0에서 알림이 크게 변경되었습니다.


알림채널을 사용해 알림을 카테고리화 할 수 있습니다.

이 기능을 사용하면 사용자는 카테고리별로 소리, 진동, 알림의 중요도를 관리할 수 있습니다.

그리고 기존에 알림의 on/off을 카테고리별로 지정할 수 있기 때문에 사용자는 자신이 받고싶은 알람만 받을 수 있습니다.


  



알림뱃지를 사용해 사용자가 아직 반응하지 않은 알림을 앱 아이콘을 통해 보여줍니다.

알림뱃지는 알림 도트라고도 불립니다.


그 외에도 다시알림(Snoozing), 알림제한시간(Timeout), 알림설정(Setting), 알림닫기이벤트(dismissal), 배경색상(Backgournd color), 메시징스타일(Messaging style) 등이 있습니다.


- PIP(Picture-in-Picture) Mode

PIP는 기존에 Android TV에서 제공되던 기능입니다. 주로 동영상 재생에 사용되는 다중창 모드입니다.

PIP는 다중 창 수명 주기를 따라갑니다.



- 다운로드 가능한 폰트(Downloadable Fonts)

Android 8.0과 Android Support Library 26을 사용하면 이 기능을 사용할 수 있습니다.

이 기능을 사용함으로써 얻을 수 있는 이점은 APK size를 줄이고 이로인해 앱 설치 성공률을 올릴 수 있고 동일한 폰트을 여러 앱이 공유할 수 있어서 유저의 데이터, 폰의 저장공간을 절약할 수 있습니다.


이 기능은 Google Play service 버전 11 이상에서만 가능합니다.


- 폰트의 Resource화

개발자 홈페이지는 XML의 글꼴이라 나와있는데 저는 폰트의 Resource화가 더 맞는거 같습니다.

기존에 Android에서 폰트르 적용하기위해 assets폴더 아래에 폰트파일을 넣어서 사용해야 했지만 이제 res폴더 아래 font폴더를 만든 후 폰트 파일을 넣으면 @font나 R.font로 접근할 수 있습니다.


- TextView 자동 크기 조절

TextView의 크기에 따라 텍스트 사이즈를 자동으로 늘리거나 줄일 수 있습니다.

(출처: https://academy.realm.io/kr/posts/android-oreo-new-features/)



- Adaptive Icon

이 기능을 사용하게 되면 사용자에게 더 좋은 시각 적인 효과를 불 수 있습니다.


- 통합 레이아웃 Margin And Padding

이제는 양옆이나 위아래를 동시에 지정 할 수 있는 xml속성이 생겼습니다.

하지만 xxxStart xxxEnd에는 영향을 주지 않기 때문에 사용을 할 때 주의해야 합니다.



- findViewById()

기존 findViewById는 View의 type에 맞게 type casting을 해줘야 했지만 이제 findViewById가 View 대신 <T extends View> T를 반환하기 때문에 type casting을 할 필요가 없어졌습니다.



이 외에도 Android 8.0에 추가되고 개선 된 많은 기능들이 있습니다.


더 알고 싶으신 분들은 아래 출처 링크를 타고 더 많은 정보를 얻어보세요.


출처

https://www.android.com/versions/oreo-8-0/

https://developer.android.com/about/versions/oreo/index.html

https://android-developers.googleblog.com/2017/08/introducing-android-8-oreo.html

https://academy.realm.io/kr/posts/android-oreo-new-features/

728x90
반응형

+ Recent posts