2019년 10월 21일 월요일

안드로이드 위젯 기초





1. String 문자열 파일 xml로 관리하기

다국어 지원을 하거나, 문자열의 관리를 쉽게 한다.



/app/res/values/string.xml 에 문자열을 정의함.




@string/... 과 같은 형식으로 참조한다.


cf) 다국어 문자열 파일 관리 방법

Android 폴더 보기 형식에서는 아래와 같은 구조를 확인할 수 없으므로 상단에서 Project Files로 변경하면 아래와 같은 구성이 보인다.


values-en, values-ko 처럼 values 뒤에 로케일을 붙여서 폴더를 생성하고
string.xml파일을 각 나라의 언어로 정의하면 된다. 기본 폴더인 values는 삭제하지 않는다.
단말에 설정된 언어에 해당하는 파일이 없는 경우 기본 폴더를 참조하기 때문이다.



2. 텍스트 뷰의 속성

-textColor : 텍스트 색상 설정


#AARRGGBB 의 형태
Alpha: 투명도, FF(투명하지 않음), 88(중간), 00(투명함)
Red: 빨강
Green: 초록
Blue: 파랑

-textStyle : 텍스트 스타일 설정
normal|bold|italic 와 같이 | 파이프라인을 이용하여 여러 속성을 함께 지정할 수 있다.

-typeFace : 문자열의 폰트 설정

-maxLines : 텍스트 뷰에서 표시하는 만주열의 최대 줄 수를 설정


maxLines을 1로 지정하고 한줄을 초과하는 text를 작성해본다.


maxLines이 1이므로 한 줄로 표시된다.

-selectAllOnFocus : true/false 로 포커스를 받을 때 문자열 전체가 선택 여부
-cursorVisible : true/false 로 커서 보임 여부
-autoLink : true/false 로 웹페이지 주소나, 이메일 주소를 링크 색상으로 표시
-lineSpacingMultiplier : 줄 간격을 기본 줄 간격의 배수로 설정
-lineSpacingExtra : 여유 값으로 설정할 때 사용
-capitalize : 글자, 단어, 문장 단위로 대소문자 조절
-ellipsize : 줄임 표시 관련 속성
-editable : 편집 가능 관련 속성



3. 버튼 속성

버튼은 텍스트뷰를 상속하여 정의되어 있으므로 텍스트뷰의 속성을 그대로 사용할 수 있다.









4. 에디트 텍스트 속성

-hint : 기본 안내문의 hint 표시
-inputType : 입력되는 글자의 유형을 정의할 수 있다. 글자를 입력할 때 보이는 키패드의 유형을 정의할 수 있다.



에디트텍스트 속성 추가하기
커서가 깜박이며 아래 글자키패드가 보여진다.





5. 이미지를 해상도에 따라 다르게 보여주기
/app/res 하위에 drawable 디렉토리를 아래와 같이 추가로 생성해주고 알맞은 이미지를 넣는다.


/app/res/drawable : 일반적으로 사용하는 기본 이미지
/app/res/drawable-xhdpi : 초고해상도
/app/res/drawable-hdpi : 고해상도
/app/res/drawable-mdpi : 중간해상도
/app/res/drawable-ldpi : 저해상도





6. 드로어블 만들기


드로어블은 뷰에 설정할 수 있는 객체이며, 그 위에 그래픽을 그릴 수 있다.
드로어블은 XML 파일이나 소스 파일로 작성할 수 있다.
drawable 폴더 안에 이미지가 아닌 XML 파일이 들어가서 이미지처럼 설정된다.



* 상태 드로어블 만들기
res/drawable 폴더를 우클릭 한 후 [Drawable resource file] 을 클릭
file name을 지정하고 OK.


selector 안에 item 요소를 추가한다.
버튼이 눌린 이미지에는 state_pressed를 true로 설정하여
버튼이 눌렸을때 눌린 이미지가 나오도록 설정한다.
그 다음줄에 아무런 상태가 설정되어 있지 않은 item은
버튼에서 손을 땐 기본 상태이며 finger 이미지가 나오게 된다.


그리고 버튼의 background 속성에 @drawable/xml파일명 을 적어서 연결하면
클릭했을때 이미지가 변하는 버튼으로 설정된다.




* 셰이프 드로어블 만들기





shape 로 바꾸고 모양을 사각형으로 설정하고 디자인 요소를 설정한다.
이것을 버튼의 background 에 @drawable/xml파일명으로 설정해주면 된다.


* 배경 그라데이션 드로어블 만들기


그라데이션을 주려면 gradient 속성을 이용하면 된다.



* 드로어블을 이용하여 테두리만 있는 버튼 만들기




layer-list 안에 item 태그를 여러개를 넣을 수 있으며
 그래픽을 중첩시켜서 표현 할 수도 있다.





위에서 작성한 드로어블들이 반영된 모습





7. 토스트, 스낵바, 대화상자 만들기


- 토스트 메시지 위치 변경 시키기


public class MainActivity extends AppCompatActivity {

    EditText editText;
    EditText editText2;

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

        editText = findViewById(R.id.editText);
        editText2 = findViewById(R.id.editText2);

    }

    public void onButton1Clicked(View v){
        try{
            Toast toastView = Toast.makeText(this, "위치가 바뀐 토스트 메시지 입니다.",
                    Toast.LENGTH_LONG);

            //위치값을 에디트텍스트에서 값을 받아와서,
            int xOffset = Integer.parseInt(editText.getText().toString());
            int yOffset = Integer.parseInt(editText2.getText().toString());

            //setGravity() 를 이용하여 토스트 위치를 바꿔준다.
            toastView.setGravity(Gravity.TOP|Gravity.TOP, xOffset, yOffset);
            toastView.show();

        }catch (NumberFormatException e){
            e.printStackTrace();
        }
    }

}


토스트 메시지의 위치가 입력한 위치에 맞춰 나타난다.



-토스트 메시지 모양 바꿔 보여주기


public void onButton2Clicked(View v){
        //LayoutInflater 객체를 이용해 XML 로 정의된 레이아웃을 메모리에 객체화 함
        LayoutInflater inflater = getLayoutInflater();

        //layout 폴더의 toastborder.xml 파일의 toast_layout_root 아이디를 가져옴
        View layout = inflater.inflate(R.layout.toastborder,
                (ViewGroup) findViewById(R.id.toast_layout_root));

        //View 객체에서 아이디가 text 인 텍스트뷰 객체를 가져옴
        TextView text = layout.findViewById(R.id.text);

        Toast toast = new Toast(this);
        text.setText("모양 바꾼 토스트");
        toast.setGravity(Gravity.CENTER, 0, -100);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.setView(layout);
        toast.show();

}



/app/layout/toastborder.xml


/app/drawable/toast.xml









- Snackbar(스낵바) 보여주기
간단한 메시지를 보여줄 때 토스트 대신 스낵바를 사용하는 경우도 많다.
스낵바는 외부 라이브러리로 추가 되었기 때문에 스낵바가 들어있는 디자인 라이브러리를 프로젝트에 추가해야 사용할 수 있다.

* 외부 라이브러리 추가하기


[File] -> [Project Structure] 클릭


좌측 Dependency 메뉴를 클릭 한 후 app을 선택. (안드로이드 스튜디오 3.5.1버전 화면)
우측에 + 버튼을 클릭하여 Library Dependency 를 선택한다.


스낵바에서 사용하는 외부라이브러리를 검색 하고 버전을 선택 후 OK 클릭


그러면 라이브러리가 추가된 것이 보이고 OK 하면
프로젝트가 재빌드 되면서 해당 라이브러리를 사용할 수 있게 된다. 



public void onButton3Clicked(View v){
       Snackbar.make(v, "스낵바입니다..~", Snackbar.LENGTH_LONG).show();
}


버튼을 클릭했을 때 하단에 스낵바 생성됨


- 알림 대화 상자(Dialog) 보여주기



public class MainActivity extends AppCompatActivity {

    TextView textView;

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

        textView = findViewById(R.id.textView);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                showMessage();
            }
        });
    }
    private void showMessage(){
        //다이얼로그 빌더를 이용하여 다이얼로그 객체를 생성
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //알림창 제목
        builder.setTitle("안내");
        //알림창 내용
        builder.setMessage("종료하시겠습니까?");
        //아이콘 설정
        builder.setIcon(android.R.drawable.ic_dialog_alert);

        builder.setPositiveButton("예", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String message = "예 버튼이 눌렸습니다";
                textView.setText(message);
            }
        });

        builder.setNeutralButton("취소", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String message = "취소 버튼이 눌렸습니다.";
                textView.setText(message);
            }
        });

        builder.setNegativeButton("아니오", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String message = "아니오 버튼이 눌렸습니다";
                textView.setText(message);
            }
        });

        //대화 상자 객체를 만든다.
        AlertDialog dialog = builder.create();
        //대화 상자를 화면에 보여준다.
        dialog.show();

    }
}



버튼을 클릭했을때 알림창이 뜬다.





8. 프로그레스바 (상태 진행바) 만들기

어떤 일의 진행 상태를 보여주기 위해 프로그레스바를 만든다.



public class MainActivity extends AppCompatActivity {
    ProgressDialog dialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //프로그레스바에 현재 상태값 설정하기
        ProgressBar progressBar = findViewById(R.id.progressBar);
        //setIndeterminate을 true 로 하게 되면 프로그레스바 진행 움직임 애니메이션이 무한정 나오게 된다. 
        // 이를 false로 하여 80이라는 값을 정지 상태로 보여주기로 한다
        progressBar.setIndeterminate(false);
        progressBar.setProgress(80);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                dialog = new ProgressDialog(MainActivity.this);
                dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                dialog.setMessage("데이터를 확인하는 중입니다.");

                dialog.show();
            }
        });

        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                //프로그레스 대화상자 없애기
                if(dialog != null){
                    dialog.dismiss();
                }
            }
        });
    }
}





스피너가 계속 돌아가면서 프로그레스 다이얼로그를 보여준다.
또한 상단에 빨간 선으로 80까지 상태 값이 표시되고 있다.
이 코드에서는 닫기 버튼으로 프로그레스 대화상자를 없앨수 없다.




댓글 없음:

댓글 쓰기