관리 메뉴

IT창고

안드로이드(Android) API 정리2 본문

프로그래밍/Android

안드로이드(Android) API 정리2

방구석여포 2017. 11. 4. 17:02


안드로이드 스튜디오를 기준으로 작성했습니다. API 정리1에 이어서 어플개발에 꼭 필요할만한 것들을 정리해보았습니다.


1. 다이얼로그(Dialog)

private void init(){

        alert = new AlertDialog.Builder(this);

        alert.setTitle("이름");

        //alert.setIcon(R.drawable.images);   옆에 그림이미지추가

        //alert.setMessage("앱을 종료하는가?");


        alert.setCancelable(false);


        alert.setPositiveButton("확인", new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialogInterface, int i) {

                dialogInterface.dismiss();

                finish();


            }

        });

        alert.setNegativeButton("취소", new DialogInterface.OnClickListener() {

            @Override

            public void onClick(DialogInterface dialogInterface, int i) {

                dialogInterface.dismiss();

            }

        });

    }

---추가---

@Override

    public void onBackPressed() {

       // super.onBackPressed(); 다이얼버튼에서 뒤로가기 버튼기능마비

        alert.show();

    }


2. 라디오 버튼

라디오 버튼은 레이아웃에서 라디오그룹에 감싸고 사용하는것이 좋습니다.

라디오 버튼이 두개있고 다이얼로그를 응용해서 하면 아래와 같이 사용할수있습니다.

1Rb = (RadioButton)findViewById(R.id.1Rb);

2Rb = (RadioButton)findViewById(R.id.2Rb);


        init();


        findViewById(R.id.btnn).setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                String aaa = "";

                if(1Rb.isChecked()){

                    aaa = "남자";

                }else if(2Rb.isChecked()){

                    aaa = "여자";

                }else{

                    aaa = "성별을 선택해주세요";

                }

                alert.setMessage(aaa);


                alert.show();

            }

        });

체크박스(CheckBox)도 이와 비슷하게 응용할수있습니다. 


3. 프리퍼런스

private void init() {

        SharedPreferences preferences = getSharedPreferences("myData", MODE_PRIVATE);

        String editsave = preferences.getString("info", "저장된 문장이 없습니다!");

        textTv.setText(editsave);

        SharedPreferences.Editor editor = preferences.edit();


    }

@Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_preffer);


        textTv = (TextView)findViewById(R.id.texTv);

        editTv = (EditText)findViewById(R.id.editTv);

        bbtn = (Button)findViewById(R.id.bbtn);


        init();


        bbtn.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                String editsave = editTv.getText().toString().trim();


                if (editsave.length() < 1) {

                    Toast.makeText(prefferActivity.this, "문장을 입력하세요!", Toast.LENGTH_SHORT).show();

                } else {

                    SharedPreferences preferences = getSharedPreferences("myData", MODE_PRIVATE);

                    SharedPreferences.Editor editor = preferences.edit();

                    editor.putString("info", editsave);

                    editor.commit();


                    Toast.makeText(prefferActivity.this, "저장 완료 입니다!", Toast.LENGTH_SHORT).show();

                    editTv.setText("");

                }

            }


        });

4. 터치리스너

클릭리스너와 다르게 터치,무브, 업의 상태를 따로 받을수있으며 사용방법은 클릭리스너와 비슷합니다.

View.OnTouchListener 를 implements 해주고 onTouch메소드를 오바라이드해준후 터치 리스터를 사용하고 싶은 뷰에

setOnTouchListener를 붙여주면 됩니다.


MotionEvent.ACTION_DOWN : 손가락이 닿았을 때

MotionEvent.ACTION_MOVE : 손가락을 드래그 할 때

MotionEvent.ACTION_UP : 손가락을 떼었을 때


단, 실제 휴대폰에서는 하드웨어가 민감하거나 손에 전자파 때문에 조금 다를수있습니다.


@Override

    public boolean onTouch(View v, MotionEvent motionEvent) {

        if(motionEvent.getAction() == MotionEvent.ACTION_DOWN) {

            textTv.setText("Down");

            prePosX = (int)motionEvent.getX();

            prePosY = (int)motionEvent.getY();

        }else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){

            //여기서 처리

            if(prePosX > motionEvent.getX()){

                textTv.setText("왼쪽으로 이동중");

                bright++;

                if (bright > 99) {

                    bright = 99;

                }

            }else if(prePosX < motionEvent.getX()){

                textTv.setText("오른쪽 이동중");

                bright--;

                if (bright < 00) {

                    bright = 00;

                }

            }

            if(prePosY > motionEvent.getY()){

                textTv.setText("위로으로 이동중");

                color++;

                if (color > 99) {

                    color = 99;

                }

            }else if(prePosY < motionEvent.getY()){

                textTv.setText("아래로 이동중");

                color--;

                if (color < 00) {

                    color = 00;   //RGB나 16진수를10진수로 변화하는 옵션 찾기

                }


            prePosX = (int) motionEvent.getX();

            prePosY = (int) motionEvent.getY();

            String colorStr = "#"+bright+"0000"+ color;   // 여기서 색상과 밝기를 조절

            layout.setBackgroundColor(Color.parseColor(colorStr));  // xml에 적용


            }


        }else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){

            textTv.setText("Move posX:"+ (int)motionEvent.getX()+"   posY:" + motionEvent.getY()); // 폰으로 사용할경우 사람의손 정전기때문에 다운을보기전에 업으로 바뀐다

        }else if(motionEvent.getAction() == MotionEvent.ACTION_UP){

            textTv.setText("Up");


        }


        return true;

    }


5. 쓰레드와 핸들러

알아두어야할 부분 - 안드로이드에서 UI에 변화를 줄수있는것은 메인쓰레드뿐이고 쓰레드에서 UI에 변화를 주기위해서는 핸들러를 통해서 UI에 변화를 주어야합니다.


TextView textTv;  //변수선언

String str;

int second;


@Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_handler);


        textTv = (TextView)findViewById(R.id.textTv);


        Thread th = new Thread(new Runnable() {

            @Override

            public void run() {

//                for (int i = 0; i < 150; i++) {

//                    for (int j = 0; j < 100; j++) {

//                        str += i+","+j;

//                    }

//                }

//

//                handler.sendEmptyMessage(0); //핸들러호출

                handler.sendEmptyMessageDelayed(1,3000);  //핸들러 딜레이 호출 앞에 1은 what값으로 id

            }

        });


        th.start();


    }


    Handler handler = new Handler(){

        @Override

        public void handleMessage(Message msg){

            super.handleMessage(msg);

            second++;

           // textTv.setText("의미 없는 작업 완료"+ second); //핸들러를 사용하지않고 쓰레드에 사용하면 에러난다 오리지날 쓰레드만 사용가능하다


            if(msg.what==1){

                textTv.setText("최초 호출 의미 없는 작업 완료 " + second);

            }else if(msg.what == 0){

                textTv.setText("의미 없는 작업 완료 " + second);

            }



            Log.d("heu","sed: "+second);  // 핸들러를 종료시키지않으면 배터리나가버림 해결방법은 와 값을 지정

            handler.sendEmptyMessageDelayed(0, 1000);

        }

    };


    @Override

    protected void onDestroy() {   //이 작업안하면 마켓이나 스토어에 올리면 욕먹습니다!

        super.onDestroy();

        handler.removeMessages(0);  //폰 메모리 안잡아먹도록 꺼주기

    }


6. 프로그래스바

프로그래스바에는 막대형과 원형이있는데 원형은 금방끝나는 작업 혹은 진행이 언제끝날지 모를작업에 사용하고 막대형은 오래걸리는 작업 혹은 진행정도를 알수있는 작업에 사용합니다.

막대형을 살펴보면 전체길이를 설정시에는 레이아웃에서 max속성으로 설정이 가능합니다.

Handler handler = new Handler(){

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);


            int curNum = progressBar.getProgress();

            curNum += 10;

            progressBar.setProgress(curNum);

            if (curNum < 100) {

                handler.sendEmptyMessageDelayed(0, 1000);

            }


        }

    };


progressBar = (ProgressBar) findViewById(R.id.progressBar);

handler.sendEmptyMessageDelayed(0,1000);


7. 권한설정

미시멜로우 이전 버전이면 AndroidManifest.xml에서 권한을 설정하면 됩니다. 

ex)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


버전이 마시멜로우 이상이라면 따로 권한을 설정해주어야합니다. JAVA


private void save(){

        String save = "저장된 문자";

        String folderName = "myTest";


        String path = Environment.getExternalStorageDirectory().getAbsolutePath(); //내부저장소 루트 폴더


        path = path + "/" + folderName;


        File file = new File(path);


        if(!file.exists()){

            file.mkdirs(); //폴더가 없으면 만들어준다

        }


        file = new File(path + "/heu.txt");  //저장할 파일 이름


        try{

            FileOutputStream fos = new FileOutputStream(file);

            fos.write(save.getBytes());

            fos.close();

        }catch (FileNotFoundException e){

            //에러 발생

            e.printStackTrace();

        }catch (IOException e){

            e.printStackTrace();

        }

    }


@Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_storgg);

        save();

        chkPermission(); //마시멜로우이상 버전 권한설정

    }


    final int PERMISSION_REQUEST =2000;  //임시설정

    private void chkPermission(){

        int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);


        if(permissionCheck == PackageManager.PERMISSION_DENIED){

            ActivityCompat.requestPermissions(this,

                    new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST);

        }

    }


    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode){

            case PERMISSION_REQUEST:

                if(grantResults.length > 0

                    && grantResults[0] == PackageManager.PERMISSION_GRANTED){

                    //허가

                    save();

            }else{

                    //거부

                }

        }

    }

Comments