728x90
728x90

콘텐트 프로바이더(Content Provider)

안드로이드는 보안상 앱에서 사용하는 데이터를 외부에서 접근할 수가 없기에 파일이나 데이터베이스를 외부 앱에서 사용하도록 하려면 콘텐트 프로바이더(Content Provider, CP)를 만들어서 외부로 제공한다.

 

URI(Uniform Resource Identifier)

콘텐트 프로바이더에서 제공하는 데이터에 접근하기 위한 주소로 content://패키지명/경로/아이디” 형식으로 지정

 

안드로이드 제공 콘텐트 프로바이더 (CP)는?

 

안드로이드에서 제공하는 주요한 콘텐트 프로바이더와 URI

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

안드로이드 방송수신자 (브로드캐스트 리시버)

 

브로드캐스트 리시버(Broadcast Receiver,BR)

안드로이드는 문자 메시지 도착, 배터리 방전, SD 카드 탈부착, 네트워크 환경 변화 등이 발생하면 방송(Broadcast) 신호를 보내는데, 이런 신호를 받아서 처리하는 것. 브로드캐스트 리시버의 대표적인 응용은 배터리 상태 확인에 쓰인다.

 

배터리와 관련된 액션과 명령어

 

 

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

안드로이드 서비스

 

서비스(Service) 

일반적으로 화면 없이 동작하는 프로그램으로 백그라운드 프로세스(Background Process)라고도 한다. 액티비티 응용 프로그램은 화면(액티비티)이 종료되면 동작하지 않지만 서비스는 백그라운드에서 실행되므로 화면과 상관없이 계속 동작한다.

 

서비스 생명 주기

 

 

화면이 종료되어도 계속되는 음악 서비스 실습

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnStart"
        android:text="음악서비스 시작"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/btnStop"
        android:text="음악서비스 중지"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

 

 

MusicService.java

- Service 클래스의 상속을 받는 MusicService 클래스 정의

package com.example.chapter14_1;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class MusicService extends Service {
    MediaPlayer mp;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        android.util.Log.i("서비스 테스트", "onCreate()");
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        android.util.Log.i("서비스 테스트", "onDestroy()");
        mp.stop();
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        android.util.Log.i("서비스 테스트", "onStartCommand()");
        mp = MediaPlayer.create(this, R.raw.song1);
        mp.setLooping(true);
        mp.start();
        return super.onStartCommand(intent, flags, startId);
    }
}

 

 

MainActivity.java

package com.example.chapter14_1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    Intent intent;
    Button btnStart, btnStop;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("서비스 테스트 예제");

        intent = new Intent(this, MusicService.class);
        btnStart = (Button) findViewById(R.id.btnStart);
        btnStop = (Button) findViewById(R.id.btnStop);

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startService(intent);
                android.util.Log.i("서비스 테스트", "startService()");
            }
        });
        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stopService(intent);
                android.util.Log.i("서비스 테스트", "stopService()");
            }
        });
    }
}

 

 

AndroidManifest.xml

- uses-sdk와 Service 추가

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.chapter14_1">

    <uses-sdk
        android:targetSdkVersion="16"
        android:minSdkVersion="8" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name="MusicService">
            <intent-filter>
                <action android:name="com.example.chapter14_1"></action>
            </intent-filter>
        </service>

    </application>

</manifest>

 


 

배터리상태 체크 예제

가상폰 옆의 ...을 누르면 배터리 잔량을 조절해 볼 수 있습니다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">

   <ImageView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:id="@+id/ivBattery"
       android:layout_gravity="center"
       android:src="@drawable/battery_0"/>

    <EditText
        android:id="@+id/edtBattery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#cccccc"
        android:enabled="false"/>

</LinearLayout>

 

MainActivity.java

package com.example.chapter14_6;

import androidx.appcompat.app.AppCompatActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    ImageView ivBattery;
    EditText edtBattery;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("배터리 상태 체크");

        ivBattery = (ImageView)findViewById(R.id.ivBattery);
        edtBattery = (EditText)findViewById(R.id.edtBattery);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(br);
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        IntentFilter iFilter = new IntentFilter();
        iFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(br, iFilter);
    }

    BroadcastReceiver br = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(action.equals(Intent.ACTION_BATTERY_CHANGED)){
                int remain = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                edtBattery.append("현재 충전량: "+remain+" %\n");

                if(remain >=90)
                    ivBattery.setImageResource(R.drawable.battery_100);
                else if(remain>=70)
                    ivBattery.setImageResource(R.drawable.battery_80);
                else if(remain>=50)
                    ivBattery.setImageResource(R.drawable.battery_60);
                else if(remain>=10)
                    ivBattery.setImageResource(R.drawable.battery_20);
                else
                    ivBattery.setImageResource(R.drawable.battery_0);
                int plug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
                switch (plug) {
                    case 0:
                        edtBattery.append("전원 연결 : 안됨");
                        break;
                    case BatteryManager.BATTERY_PLUGGED_AC:
                        edtBattery.append("전원 연결 : 어댑터 연결됨");
                        break;
                    case BatteryManager.BATTERY_PLUGGED_USB:
                        edtBattery.append("전원 연결 : USB 연결됨");
                        break;
                }
            }
        }
    };
}

 

실습파일.zip
0.34MB

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

1. 안드로이드 CRUD (입력, 수정, 추가, 삭제) 파일구성

 

 

 

2. 코드구성

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    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:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="새로고침"
        android:id="@+id/btnRefresh"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="추가"
        android:id="@+id/btn_add"/>
    
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="추가"
        android:id="@+id/listView"/>

</LinearLayout>

 

 

MainActivity.java

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    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:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="새로고침"
        android:id="@+id/btnRefresh"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="추가"
        android:id="@+id/btn_add"/>
    
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="추가"
        android:id="@+id/listView"/>

</LinearLayout>
728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

구구단 맞추기

 

<난수생성!> 버튼을 눌러서, 첫번째 칸과 두번째 칸에 2~9 사이의 난수를 만든다
(nextInt(8)의 매개변수는 0~7 사이의 난수를 생성시킨다. 그러므로, 2를 더하면 2~9 사이의 난수가 생성된다.)

난수 발생 코드:  int rand1 = new Random().nextInt(8)+2;

 

3번째 칸에 정답을 넣고 <정답확인!> 버튼을 누른다.

 

코드

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent">

<LinearLayout
    android:id="@+id/lLay1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:orientation="horizontal">


    <EditText
        android:id="@+id/edt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="x" />

    <EditText
        android:id="@+id/edt2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="=" />


    <EditText
        android:id="@+id/edt3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>

    <Button
        android:id="@+id/btnOK"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/lLay1"
        android:layout_alignRight="@id/lLay1"
        android:text="정답 확인" />

    <Button
        android:id="@+id/btnRandom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/lLay1"
        android:layout_marginTop="-4dp"
        android:layout_toLeftOf="@id/btnOK"
        android:text="난수 생성" />


    <ListView
        android:id="@+id/list1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/btnOK"
        tools:ignore="UnknownId" />

</RelativeLayout>
package com.example.middletest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

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

        final EditText edt1 = (EditText) findViewById(R.id.edt1);
        final EditText edt2 = (EditText) findViewById(R.id.edt2);
        final EditText edt3 = (EditText) findViewById(R.id.edt3);

        final ListView list1 = (ListView) findViewById(R.id.list1);

        Button btnRandom = (Button)findViewById(R.id.btnRandom);
        Button btnOK = (Button)findViewById(R.id.btnOK);

        btnRandom.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                int rand1 = new Random().nextInt(8)*2;
                int rand2 = new Random().nextInt(8)*2;
                edt1.setText(String.valueOf(rand1));
                edt2.setText(String.valueOf(rand2));
            }
        });
        btnOK.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(view.getWindowToken(), 0);

                String str1 = edt1.getText().toString();
                String str2 = edt2.getText().toString();
                String str3 = edt3.getText().toString();
                int a1 = Integer.parseInt(str1);
                int a2 = Integer.parseInt(str2);
                int a3 = Integer.parseInt(str3);

                int a4 = a1*a2;

                if(a3 == a4) //정답
                {
                    Toast.makeText(MainActivity.this, "정답입니다!",
                            Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(MainActivity.this, "틀렸습니다!",
                            Toast.LENGTH_SHORT).show();
                    String[] values = new String[9];
                    for(int i=0; i<9; i++) {
                        values[i] = String.valueOf(a1) + "X" + (i+1) + "=" + (a1*(i+1));
                    }
                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,
                            android.R.layout.simple_list_item_1, values);
                    list1.setAdapter(adapter);
                }
            }
        });

    }
}

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

1. 어댑터뷰

AdapterView 하위에 ListView, ExpandableListView, GridView, Spinner, Gallery 등을 묶어서 표현
어댑터뷰를 사용할 때 어댑터뷰의 모양을 설정하고 데이터를 채워주는 ArrayAdapter<T> 클래스를 함께 사용


어댑터를 만드는 원리 : ArrayAdpater를 예로 보면 생성자가 있다. (New...)
구성요소 -----> ArrayAdapter(위치(Activity),  디자인(한줄), 데이터(다중)) 이 형식으로 쓴다.
어댑터를 어댑터 뷰에 꽂아주면 된다...

* simple : ArrayAdapter
* complex : BaseAdapter를 상속해서 내가 만든다. (MyAdapter 이런 식으로)

 

 

 

2. 리스트뷰

- 데이터를 리스트 모양으로 보여주며 리스트 중 하나를 선택하는 용도

 

리스트뷰 예제

 

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView1"/>

</LinearLayout>

 

java

package com.example.chapter11;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("리스트뷰 테스트");

        final String[] mid ={"히어로즈", "24시", "로스트", "로스트룸", "스몰빌",
                "탐정몽크", "빅뱅이론", "프렌즈", "덱스터", "글리",
                "가쉽걸", "테이큰", "슈퍼내추럴", "브이"};
        ListView list = (ListView) findViewById(R.id.listView1);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        			android.R.layout.simple_list_item_1, mid);
       
       list.setAdapter(adapter);

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(getApplicationContext(), mid[i], Toast.LENGTH_SHORT).show();
            }
        });
    }
}

 

 

 

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edtItem"
        />

    <Button
        android:id="@+id/btnAdd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#dddddd"
        android:text="항목 추가"/>

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

</LinearLayout>

 

java

package com.example.chapter11_04;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

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

        final ArrayList<String> midList = new ArrayList<String>();
        ListView list = (ListView) findViewById(R.id.listView1);

        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,midList);
        list.setAdapter(adapter);

        final EditText edtItem = (EditText) findViewById(R.id.edtItem);
        Button btnAdd = (Button) findViewById(R.id.btnAdd);

        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                midList.add(edtItem.getText().toString());
                adapter.notifyDataSetChanged();
            }
        });
        list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                midList.remove(i);
                adapter.notifyDataSetChanged();
                return false;
            }
        });
    }
}

 

 

3. 그리드뷰

- 그리드뷰(GridView) 사진이나 그림을 격자 모양으로 배치
- XML 파일에는 간단히 <GridView>넣으면 되지만, Java 코드에는 필요한 내용을 반드시 코딩
<GridView>의 속성 중 열 개수를 지정하는 numColumns는 꼭 필요

 

그리드뷰 영화 포스터 예제

 

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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=".MainActivity">

    <GridView
        android:id="@+id/gridView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:numColumns="4"/>

</LinearLayout>

 

layout > dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/ivPoster"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>

 

 

java

package com.example.chapter11_6;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("그리드뷰 영화 포스터");

        final GridView gv = (GridView) findViewById(R.id.gridView1);
        MyGridAdapter gAdapter = new MyGridAdapter(this);
        gv.setAdapter(gAdapter);
    }
        public class MyGridAdapter extends BaseAdapter {
            Context context;

            public  MyGridAdapter(Context c){
                context = c;
            }
            public int getCount(){
                return posterID.length;
            }
            public Object getItem(int position){
                return null;
            }
            public long getItemId(int position){
                return  0;
            }

            Integer[] posterID = {R.drawable.mov01, R.drawable.mov02,
                    R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,
                    R.drawable.mov06, R.drawable.mov07, R.drawable.mov08,
                    R.drawable.mov09, R.drawable.mov10,
                    R.drawable.mov01, R.drawable.mov02,
                    R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,
                    R.drawable.mov06, R.drawable.mov07, R.drawable.mov08,
                    R.drawable.mov09, R.drawable.mov10,
                    R.drawable.mov01, R.drawable.mov02,
                    R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,
                    R.drawable.mov06, R.drawable.mov07, R.drawable.mov08,
                    R.drawable.mov09, R.drawable.mov10
            };

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ImageView imageView = new ImageView(context);
                imageView.setLayoutParams(new GridView.LayoutParams(100,150));
                imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                imageView.setPadding(5,5,5,5);

                imageView.setImageResource(posterID[position]);

                final int pos = position;
                imageView.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View view) {
                        View dialogView = (View) View.inflate(MainActivity.this,
                                R.layout.dialog, null);
                        AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
                        ImageView ivPoster = (ImageView)dialogView.findViewById(R.id.ivPoster);
                        ivPoster.setImageResource(posterID[pos]);
                        dlg.setTitle("큰 포스터");
                        dlg.setIcon(R.drawable.ic_launcher_foreground);
                        dlg.setView(dialogView);
                        dlg.setNegativeButton("닫기", null);
                        dlg.show();
                    }
                });
                return imageView;
            }
        }
}

 

 

//수정된 xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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=".MainActivity">

    <GridView
        android:id="@+id/gridView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:numColumns="4"/>

</LinearLayout>
//수정된 java
package com.example.chapter11_6;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("그리드뷰 영화 포스터");

        final GridView gv = (GridView) findViewById(R.id.gridView1);
        // 1. 어댑터만들기
        
        MyGridAdapter gAdapter = new MyGridAdapter(this);
        gv.setAdapter(gAdapter);
        // 베이스 어댑터를 상속받는 커스텀 어댑터 만들기
        // 2. 어댑터를 어댑터뷰(=그리드뷰)에 연결
    }
        public class MyGridAdapter extends BaseAdapter {
            Context context;

            public  MyGridAdapter(Context c){ //
                context = c;
            }
            public int getCount(){  //전체 그림의 갯수
                return posterID.length;
            }
            public Object getItem(int position){
                return null;
            }
            public long getItemId(int position){
                return  0;
            }

            Integer[] posterID = {R.drawable.mov01, R.drawable.mov02,
                    R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,
                    R.drawable.mov06, R.drawable.mov07, R.drawable.mov08,
                    R.drawable.mov09, R.drawable.mov10,
                    R.drawable.mov01, R.drawable.mov02,
                    R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,
                    R.drawable.mov06, R.drawable.mov07, R.drawable.mov08,
                    R.drawable.mov09, R.drawable.mov10,
                    R.drawable.mov01, R.drawable.mov02,
                    R.drawable.mov03, R.drawable.mov04, R.drawable.mov05,
                    R.drawable.mov06, R.drawable.mov07, R.drawable.mov08,
                    R.drawable.mov09, R.drawable.mov10
            };

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ImageView imageView = new ImageView(context);
                imageView.setLayoutParams(new GridView.LayoutParams(100,150));
                imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                imageView.setPadding(5,5,5,5);

                imageView.setImageResource(posterID[position]);
				//위의 변수가 final 이면 안되니까
                final int pos = position;
                imageView.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View view) {
                        View dialogView = (View) View.inflate(MainActivity.this,
                                R.layout.dialog, null);
                        AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
                        ImageView ivPoster = (ImageView)dialogView.findViewById(R.id.ivPoster);
                        ivPoster.setImageResource(posterID[pos]);
                        dlg.setTitle("큰 포스터");
                        dlg.setIcon(R.drawable.ic_launcher_foreground);
                        dlg.setView(dialogView);
                        dlg.setNegativeButton("닫기", null);
                        dlg.show();
                    }
                });
                return imageView;
            }
        }
}

 

 

 

 

4. 갤러리(Gallery)

사진이나 이미지를 배치하고 좌우로 스크롤해서 볼 수 있도록 해줌
이미지 목록을 스크롤하는 기능만 있다.
- 이미지를 클릭하면 큰 이미지를 보이게 하는 방법은 Java 코드를 추가하여 사용

 

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Gallery
        android:id="@+id/gallery1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:spacing="5dp" />
    <ImageView
        android:id="@+id/ivPoster"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="20dp" />
</LinearLayout>

 

java

package com.example.chapter11_12;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("갤러리 영화 포스터");

        Gallery gallery = (Gallery) findViewById(R.id.gallery1);
        MyGalleryAdapter galAdapter = new MyGalleryAdapter(this);
        gallery.setAdapter(galAdapter);
    }
        public class  MyGalleryAdapter extends BaseAdapter {
            Context context;
            Integer[] posterID = {
                    R.drawable.mov11, R.drawable.mov12, R.drawable.mov13,
                    R.drawable.mov14, R.drawable.mov15, R.drawable.mov16,
                    R.drawable.mov17, R.drawable.mov18, R.drawable.mov19,
                    R.drawable.mov20
            };
            public MyGalleryAdapter(Context c){
                context = c;
            }
        public int getCount() {
                return  posterID.length;
        }
        public Object getItem(int arg0){
                return null;
        }
        public long getItemId(int position){
                return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
                ImageView imageview = new ImageView(context);
                imageview.setLayoutParams(new Gallery.LayoutParams(100,150));
                imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);
                imageview.setPadding(5,5,5,5);
                imageview.setImageResource(posterID[position]);

                final int pos = position;
                imageview.setOnTouchListener(new View.OnTouchListener(){
                    @Override
                    public boolean onTouch(View view, MotionEvent motionEvent) {
                        ImageView ivPoster = (ImageView) findViewById(R.id.ivPoster);
                        ivPoster.setScaleType(ImageView.ScaleType.FIT_CENTER);
                        ivPoster.setImageResource(posterID[pos]);
                        return false;
                    }
                });
                return imageview;
        }
    }
}

 

 

5. 스피너 (Spinner)

PC드롭 다운(Drop Down) 박스와 비슷한 기능을

 

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         />

</LinearLayout>

 

java

package com.example.chapter11_16;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("스피너 테스트");

        final String[] movie = {"쿵푸팬더", "짱구는 못말려", "아저씨",
                "아바타", "대부", "국가대표", "토이스토리3", "마당을 나온 암탉",
                "죽은 시인의 사회", "서유기"};

        Spinner spinner = (Spinner) findViewById(R.id.spinner1);

        ArrayAdapter<String> adapter;
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, movie);
        spinner.setAdapter(adapter);
    }
}

 

 

..
728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

안드로이드 4대 컴포넌트

안드로이드 아키텍쳐에서 가장 중요한 요소. 4가지가 반드시 있어야하는건 아니지만
액티비티는 무조건 1개 이상 존재
해야한다. 나머지는 선택적이다.

 


 

액티비티 

화면을 구성하는 가장 기본적인 컴포넌트

public class MainActivity extends Activity {
      @Override
      public void onCreate(Bundle savedInstanceState) {

 

서비스 : 액티비티와 상관없이 백그라운드에서 동작하는 컴포넌트
서비스 생성 -> 서비스 시작 -> 서비스 종료

브로드캐스트 리시버 : 방송 수신. OS가 공지해주는 것. 배터리 방전, 문자메세지 도착, SD카드 탈부착, 네트워크 환경 변화 등이 발생하면 방송 신호를 보냄.

컨텐트 프로바이더 : 제공자. 응용프로그램 사이에 데이터(컨텐츠, 주로 글자)를 상호 공유하기 위한 컴포넌트. 콘텐트 프로바이더의 정보를 제공하는 방법으로는 URI가 있다. (Uniform Resource Identifier). 인텐트는 액티비티 사이를 연결한다.

양방향 액티비티 : 메인 액티비티에서 세컨드 액티비티로 데이터를 넘긴 후에 다시 메인 액티비티로 데이터를 돌려주는 경우. 보낼 때 putExtra(), 받을 때 getExtra()로 받는다. 주고받을 때 "" 안에다가 데이터형과 함께 보낸다.

 

 

액티비티 생명주기

액티비티의 생성부터 소멸까지의 주기. 
안드로이드는 화면이 작아 동시에 여러 개의 액티비티(화면)가 나올 수 없다.
앞의 화면 하나만 활성화된 상태이고 나머지는 모두 비활성화된 상태로 남게 된다.

 

 


 

인텐트

인텐트는 안드로이드 4개 컴포넌트가 상호 간에 데이터를 주고 받기 위한 메시지 객체다. 명시적 인텐트와 암시적 인텐트로 구분한다.

 

명시적 인덴트

다른 액티비티의 이름을 명확히 지정할 때 사용하는 방법
메인 액티비티에서 인텐트에 데이터를 실어서 넘긴 후 세컨드 액티비티에서 받은 데이터를 처리

 

 

암시적 인텐트 (Implicit Intent, 묵시적 인텐트)

약속된 Action을 지정하여 안드로이드에서 제공하는 기존 응용프로그램을 실행하는 것
전화 발신을 예를 들면 전화번호를 인텐트로 넘긴 후에 전화걸기 응용프로그램이 실행되는 것과 같다.

 

암시적 인텐트(Implicit Intent, 묵시적 인텐트) 911에 응급전화를 거는 형식
전화 걸기를 하려면 AndroidManifest.xml에 다음과 같이 권한을 추가해야 함

 


 

로그캣 : 작성중인 프로그램에 예기치 못한 오류가 발생했을 때 원인을 파악하는 방법 중 하나가 로그를 남기는 것이다.

 


 

실습하기

 

버튼을 누르면 새 화면이 열리는 예제 (액티비티 두 개 사용)

 

1. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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=".MainActivity">

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="새 화면 열기"
    android:id="@+id/btnNewActivity" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:background="#00FF00"
    android:orientation="vertical"
    tools:context=".MainActivity">
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="돌아가기"
        android:id="@+id/btnReturn" />
</LinearLayout>

 

 

2. MainActivity.java

package com.example.ex7_listchat;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("메인 액티비티");

        Button btnNewActivity = (Button) findViewById(R.id.btnNewActivity);
        btnNewActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,
                        SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

 

 

3. 새로운 액티비티인 SecondActivity.java 파일을 만든다.

 

자바 코드에 액티비티의 필수 메소드인 onCreate()를 추가한 후 자동완성한다. second.xml을 화면에 보여주는 코드를 추가하고, second.xml의 <돌아가기>를 클릭하면 현재 액티비티를 끝내는 코드를 추가한다. SecondActivity는 메인 액티비티에서 호출할 것이므로 SecondActivity를 종료하면 다시 메인 액티비티가 나타난다. 메인 액티비티에서 SecondActivity를 호출하는 코드를 추가한다.

 

4. secondActivity.java

package com.example.ex7_listchat;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        setTitle("Second 액티비티");

        Button btnReturn = (Button) findViewById(R.id.btnReturn);
        btnReturn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                finish();
            }
        });
    }
}

 

완성된 프로젝트를 실행하면 '프로젝트명'이 강제 중지되었다는 오류가 발생. 
안드로이드에서는 사용될 액티비티를 AndroidManifest.xml에 꼭 등록해야하며 메인 액티비티는 자동 등록되지만 추가한 SecondActivity는 별도로 등록해줘야 한다.

 

5. manifests > AndroidManifest.xml

파일에 SecondActivity를 등록해서 application 태그 안에 코딩한다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ex7_listchat">

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity
            android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SecondActivity"
            android:label="Second 액티비티"/>
    </application>
</manifest>

 

//xml
//xml

 


 

레이팅바 예제

 

activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <RatingBar
        android:id="@+id/ratingBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <RatingBar
        android:id="@+id/ratingBar2"
        style="?android:attr/ratingBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:numStars="10"
        android:stepSize="1"/>
    <RatingBar
        android:id="@+id/ratingBar3"
        style="?android:attr/ratingBarStyleIndicator"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:rating="1.5"/>
    <Button
        android:id="@+id/btnInc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="증가시키기"/>
    <Button
        android:id="@+id/btnDec"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="감소시키기"/>
</LinearLayout>

 

java

package com.example.chapter10;

import androidx.appcompat.app.AppCompatActivity;

import android.media.Rating;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RatingBar;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final RatingBar rating1, rating2, rating3;
        Button btnInc, btnDec;

        rating1 = (RatingBar) findViewById(R.id.ratingBar1);
        rating2 = (RatingBar) findViewById(R.id.ratingBar2);
        rating3 = (RatingBar) findViewById(R.id.ratingBar3);
        btnInc = (Button) findViewById(R.id.btnInc);
        btnDec = (Button) findViewById(R.id.btnDec);

        btnInc.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                rating1.setRating(rating1.getRating()+rating1.getStepSize());
                rating2.setRating(rating2.getRating()+rating2.getStepSize());
                rating3.setRating(rating3.getRating()+rating3.getStepSize());
            }
        });
        btnDec.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                rating1.setRating(rating1.getRating()-rating1.getStepSize());
                rating2.setRating(rating2.getRating()-rating2.getStepSize());
                rating3.setRating(rating3.getRating()-rating3.getStepSize());
            }
        });
    }
}

 


 

실습 10-2 명화 선호도 투표 앱 만들기

 

 

activity_main.xml 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3">

        <ImageView
            android:id="@+id/iv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/pic1" />

        <ImageView
            android:id="@+id/iv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/pic2" />

        <ImageView
            android:id="@+id/iv3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/pic3" />

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3">

        <ImageView
            android:id="@+id/iv4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/pic4" />

        <ImageView
            android:id="@+id/iv5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/pic5" />

        <ImageView
            android:id="@+id/iv6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/pic6" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3">
        <ImageView
            android:id="@+id/iv7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/pic7"/>
        <ImageView
            android:id="@+id/iv8"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/pic8"/>
        <ImageView
            android:id="@+id/iv9"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:src="@drawable/pic9"/>
    </LinearLayout>

    <Button
        android:id="@+id/btnResult"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="투표 종료"/>

</LinearLayout>

 

메인 액티비티에서 사용할 activity_main.xml 수정

-  바깥 리니어레이아웃 안에 리니어레이아웃 3, 버튼 1개를 생성 
-  layout_weight 3:3:3:1 
-  3개의 레이아웃에는 각각 3개의 이미지 뷰를 넣고 layout_weigh 1:1:1 
- 필요하면 이미지뷰에 적당한 layout_margin(ex : 5dp) 
- 9 이미지뷰의 id iv1~iv9, 버튼의 id btnResult로 함

 

MainActivity.java

package com.example.chapter10_9;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("명화 선호도 투표");

        final int voteCount[] = new int[9];
        for(int i=0; i<9; i++) {
            voteCount[i] = 0;
            //9개의 이미지 버튼 객체배열
        }
        ImageView image[] = new ImageView[9];
            // 9개의 이미지버튼 ID 배열

        Integer imageId[] = { R.id.iv1, R.id.iv2, R.id.iv3, R.id.iv4,
                    R.id.iv5, R.id.iv6, R.id.iv7, R.id.iv8, R.id.iv9 };

        final String imgName[] = { "독서하는 소녀", "꽃장식 모자 소녀", "부채를 든 소녀",
            "이레느깡 단 베르양", "잠자는 소녀", "테라스의 두 자매", "피아노 레슨",
            "피아노 앞의 소녀들", "해변에서"};

        for (int i = 0; i<imageId.length; i++){
            final int index;
            index = i;
            image[index] = (ImageView) findViewById(imageId[index]);
            image[index].setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                    //투표수 증가
                    voteCount[index]++;
                    Toast.makeText(getApplicationContext(),
                            imgName[index]+": 총"+ voteCount[index] +" 표",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
        Button btnFinish = (Button) findViewById(R.id.btnResult);
        btnFinish.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
                intent.putExtra("VoteCount", voteCount);
                intent.putExtra("ImageName", imgName);
                startActivity(intent);
            }
        });
    }
}

 

 

result.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:stretchColumns="0"
    >

    <TableRow>
        <TextView
            android:id="@+id/tv1"
            android:layout_gravity="center_vertical"
            android:text="그림1"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar1"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right">
        </RatingBar>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/tv2"
            android:layout_gravity="center_vertical"
            android:text="그림2"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar2"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right">
        </RatingBar>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/tv3"
            android:layout_gravity="center_vertical"
            android:text="그림2"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar3"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right">
        </RatingBar>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/tv4"
            android:layout_gravity="center_vertical"
            android:text="그림2"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar4"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right">
        </RatingBar>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/tv5"
            android:layout_gravity="center_vertical"
            android:text="그림2"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar5"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right">
        </RatingBar>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/tv6"
            android:layout_gravity="center_vertical"
            android:text="그림2"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar6"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right">
        </RatingBar>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/tv7"
            android:layout_gravity="center_vertical"
            android:text="그림2"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar7"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right">
        </RatingBar>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/tv8"
            android:layout_gravity="center_vertical"
            android:text="그림2"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar8"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right">
        </RatingBar>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/tv9"
            android:layout_gravity="center_vertical"
            android:text="그림2"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar9"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right">
        </RatingBar>
    </TableRow>
    <TableRow>
        <Button
            android:id="@+id/btnReturn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="돌아가기"/>
    </TableRow>
</TableLayout>

 

* 서브 액티비티에서 사용할 result.xml /res/layout 폴더에 생성

바깥은 테이블레이아웃으로 설정
stretchColumns 속성을 0으로 함
<TableRow>를 그림의 숫자와 동일한 (9+1)개로 하고, 각 테이블 로우에는 텍스트뷰 1, 래이팅바 1개를 생성
마지막 테이블 로우에는 <돌아가기> 생성
텍스트뷰의 id tv1~tv9, 래이팅바의 id rbar1~rbar9, 버튼의 id btnReturn으로 함

 

ResultActivity.java

package com.example.chapter10_9;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RatingBar;
import android.widget.TextView;

public class ResultActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.result);
        setTitle("투표 결과");

        //앞 화면에서 보낸 투표 결과 값을 받는다.
        Intent intent = getIntent();
        int[] voteResult = intent.getIntArrayExtra("VoteCount");
        String[] imageName = intent.getStringArrayExtra("ImageName");

        //9개의 TextView, Rating Bar 객체배열
        TextView tv[] = new TextView[imageName.length];
        RatingBar rbar[] = new RatingBar[imageName.length];

        //9개의 TextView, Rating Bar ID 배열
        Integer tvID[] = { R.id.tv1, R.id.tv2, R.id.tv3,
                R.id.tv4, R.id.tv5, R.id.tv6, R.id.tv7, R.id.tv8, R.id.tv9 };
        Integer rbarID[] = { R.id.rbar1, R.id.rbar2, R.id.rbar3,
                R.id.rbar4, R.id.rbar5, R.id.rbar6, R.id.rbar7, R.id.rbar8, R.id.rbar9 };

        for (int i = 0; i<voteResult.length; i++){
            tv[i] = (TextView) findViewById(tvID[i]);
            rbar[i] = (RatingBar) findViewById(rbarID[i]);
        }

        //각 TextView 및 RatingBar 에 넘겨 받은값을 반영
        for (int i=0; i<voteResult.length; i++){
            tv[i].setText(imageName[i]);
            rbar[i].setRating((float)voteResult[i]);
        }

        Button btnReturn = (Button) findViewById(R.id.btnReturn);
        btnReturn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                finish();
            }
        });
    }
}

 

* Java 코드 작성 및 수정

새로운 액티비티인 ResultActivity.java 파일을 만듦
onCreate( ) 메소드를 추가한  setContentView(R.layout.result) 추가
AndroidManifest.xml에 등록

* onCreate() 내부에 필요한 변수 선언

그림을 클릭할 때마다 투표 수를 저장할 9개짜리 배열을 선언하고 0으로 초기화
이미지뷰 위젯을 저장할 9개짜리 배열을 선언
이미지뷰 위젯의 id R.id.iv1 ~ iv9  저장한 배열을 선언
그림의 이름을 저장한 9개짜리 배열 선언

* onCreate() 내에 이미지 클릭 시 동작할 내용 코딩
 이미지뷰에 대해 클릭 이벤트 리스너 생성 
이미지뷰가 9개이므로 반복문을 사용
이미지 클릭하면 각 이미지의 투표수가 증가하도록 설정
이미지 클릭할 때마다 해당 이미지 이름과 누적된 투표수도 토스트 메시지로 보여줌

* onCreate() 내에 <투표 종료>에 대해서 클릭 이벤트 리스너 생성
인텐트를 생성, 인텐트에 투표수 배열과 그림 이름 배열을 넣은  결과 액티비티 호출

 

AndroidManifest.xml 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.chapter10_9">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ResultActivity"/>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

* 서브 액티비티인 ResultActivity.java 파일의 onCreate( ) 메소드 안을 코딩
- 메인 액티비티에서 보낸 인텐트 받고넘겨 받은 투표 결과 배열과 그림 이름 배열 저장

* 서브 액티비티 나머지 코딩
- 
result.xml 텍스트뷰 9개와 래이팅바 9개의 위젯 변수 배열을 선언

* 텍스트뷰 id를 저장한 배열 변수래이팅바의 id를 저장한 배열 변수를 선언

* XML 파일의 텍스트뷰  래이팅바를 위젯 변수에 대입

* 텍스트뷰 위젯 변수에 넘겨받은 그림 이름을 적용

* 래이팅바에는 넘겨받은 투표 결과를 적용

* 버튼을 클릭하면 서브 액티비티를 종료 -> , 메인 액티비티로 돌아간다.

 

 

//activity_result.xml 수정

<TableRow>
	<TextView
    	android:id="@+id/tvTop"
        android:text="1등"
        android:textSize="15sp"
        android:layout_gravity="center"
		android:layout_span="2"
        />
</TableRow>
<TableRow>
	<ImageView
    	android:id="@+id/ivTop"
		android:layout_span="2"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:src="@drawable/pic1"
        android:scaleType="fitCenter"
        />
</TableRow>

...

//레이팅바를 작은 모델로 만드는 것은 design탭에서 바꾸면 편하다.

 

//ResultActivity.java 수정 - 가장 많이 받은 득표의 그림을 보여준다.
//max값은 0으로 잡아 비교하는 알고리즘

..

int[] voteResult = intent.getIntArrayExtra("VoteCount");
String imageName = intent.getStringtArrayExtra("ImageName");

Integer imageField[] = R.drawable.pic1, R.drawable.pic2,
						R.drawable.pic3, R.drawable.pic4, R.drawable.pic5,
						R.drawable.pic6, R.drawable.pic7, R.drawable.pic8,
						R.drawable.pic9 };

TextView tvTop = (TextView)findViewById(R.id.tvTop);
ImageView ivTop = (ImageView)findViewById(R.id.ivTop);

//투표수가 최대인 것
int max_index=0;
for(int i=0; i<voteResult.lenght; ++i)
	{
    //가장 큰값의 번지를 구하게 된다.
	if( voteResult[max_index] < voteResult[i] )
    	max_index = i;
	}
tvTop.setText(imageName[max_index]);
ivTop.setImageResource(imageFiled[max_index]);

//9개의 TextView, RatingBar 객체배열
TextView tv[] = new TextView[imageName.length];

..

 

 


 

양방향 데이터 전달 예제


메인 액티비티의 에디트텍스트의 두 수를 세컨드 액티비티에서더한 후에 다시 메인 액티비티로 돌려준다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical">

    <EditText
        android:id="@+id/edtNum1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <EditText
        android:id="@+id/edtNum2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/btnNewActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="더하기"/>

</LinearLayout>

 

MainActivity.java

package com.example.chapter10_16;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("메인 액티비티");

        Button btnNewActivity = (Button) findViewById(R.id.btnNewActivity);
        btnNewActivity.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                EditText edtNum1 = (EditText) findViewById(R.id.edtNum1);
                EditText edtNum2 = (EditText) findViewById(R.id.edtNum2);

                Intent intent = new Intent(getApplicationContext(),
                        SecondActivity.class);
                intent.putExtra("Num1",
                        Integer.parseInt(edtNum1.getText().toString()));
                intent.putExtra("Num2",
                        Integer.parseInt(edtNum2.getText().toString()));
                startActivityForResult(intent, 0);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(resultCode==RESULT_OK) {
            int hap = data.getIntExtra("Hap", 0);
            Toast.makeText(getApplicationContext(), "합계:" + hap,
                    Toast.LENGTH_SHORT).show();
        }
    }
}

 

second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical">
    
    <Button
        android:id="@+id/btnReturn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="돌아가기"/>

</LinearLayout>

 

SecondActivity.java

package com.example.chapter10_16;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        setTitle("Second 액티비티");
        Intent inIntent = getIntent();
        final int hapValue = inIntent.getIntExtra("Num1", 0) +
                inIntent.getIntExtra("Num2", 0);

        Button btnReturn = (Button) findViewById(R.id.btnReturn);
        btnReturn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent outIntent = new Intent(getApplicationContext(), 
                        MainActivity.class);
                outIntent.putExtra("Hap", hapValue);
                setResult(RESULT_OK, outIntent);
                finish();
            }
        });
    }
}

 

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.chapter10_16">
    
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

 


 

암시적 인텐트 예제

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnDial"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="전화 걸기"/>
    <Button
        android:id="@+id/btnWeb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="홈페이지 열기"/>
    <Button
        android:id="@+id/btnGoogle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="구글맵 열기"/>
    <Button
        android:id="@+id/btnSearch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="구글 검색하기"/>
    <Button
        android:id="@+id/btnSms"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="문자 보내기"/>
    <Button
        android:id="@+id/btnPhoto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="사진 보기"/>
</LinearLayout>

 

MainActivity.java

package com.example.chapter10_20;

import androidx.appcompat.app.AppCompatActivity;

import android.app.SearchManager;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("암시적 인텐트 예제");

        Button btnDial = (Button) findViewById(R.id.btnDial);
        Button btnWeb = (Button) findViewById(R.id.btnWeb);
        Button btnGoogle = (Button) findViewById(R.id.btnGoogle);
        Button btnSearch = (Button) findViewById(R.id.btnSearch);
        Button btnSms = (Button) findViewById(R.id.btnSms);
        Button btnPhoto = (Button) findViewById(R.id.btnPhoto);

        btnDial.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Uri uri = Uri.parse("tel: 010-1234-5678");
                Intent intent = new Intent(Intent.ACTION_DIAL, uri);
                startActivity(intent);
            }
        });

        btnWeb.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Uri uri = Uri.parse("http://www.naver.com");
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
            }
        });

        btnGoogle.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Uri uri = Uri.parse("geo:37.5543,126.9135");
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
            }
        });

        btnSearch.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
                intent.putExtra(SearchManager.QUERY, "안드로이드");
                startActivity(intent);
            }
        });

        btnSms.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.putExtra("sms_body", "안녕하세요?");
                intent.setType("vnd.android-dir/mms-sms");
                startActivity(intent);
            }
        });

        btnPhoto.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                Uri uri = Uri.fromFile(new File("/sdcard/jeju13.jpg"));
                intent.setDataAndType(uri, "image/jpeg");
                startActivity(intent);
            }
        });
    }
}

 

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.chapter10_20">

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />
    
    <uses-permission android:name="android.permission.CALL_PHONE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

View > Tool Windows > Device File Explorer

 


 

로그캣 예제

//xml
//xml

android.util.log.i ("") 부분에 공백을 적으면 안된다. (10-24)

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

대화상자

사용자에게 중요한 사항을 알려준 후 어떤 선택을 하게 하는 것이 목적

 

 


 

실습하기 (xml)

 

1) 기본 대화상자

<LinearLayout
	android:gravity="center_horizontal">
    	<Button
        	android:id="@+id/button1"
            android:text="대화상자" />
</LinearLayout>

 

자바코드 (버튼없음)

public void onCreate(Bundle savedInstanceState) {
	super.onCreaate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Button button1 = (Button) findViewById(R.id.button1);
    button1.setOnclickListener(new View.OnclickListener() {

		public void onClick(View v) {
        	AlertDialog.Builder dlg = new AlertDialog.Builder(액티비티명.this);
            dlg.setTitle("제목입니다");
            dlg.setMessage("이곳이 내용입니다");
            dlg.setIcon(R.drawable.ic_launcher);
            dlg.show();
            }
	});
}         
//버튼 1개
public void onCreate(Bundle savedInstanceState) {
	super.onCreaate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Button button1 = (Button) findViewById(R.id.button1);
    button1.setOnclickListener(new View.OnclickListener() {

		public void onClick(View v) {
        	AlertDialog.Builder dlg = new AlertDialog.Builder(액티비티명.this);
            dlg.setTitle("제목입니다");
            dlg.setMessage("이곳이 내용입니다");
            dlg.setIcon(R.drawable.ic_launcher);
            dlg.setPositiveButton("확인", null);
            dlg.show();
            }
	});
}         

 

 

버튼 클릭 시 동작하는 대화상자의 Java 코드

setPositiveButton("문자열", 리스너)의 리스너가 null이라 아무 동작도 안하므로 해당 부분 수정

dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() {
	public void onClick(DialogInterface dialog, int which) {
    	Toast.makeText(액티비티명.this, "확인을 눌렀네요", 0).show();
    }
}

 

 


 

2) 목록 대화상자

 

public void onClick(View v) {
	final String[] versionArray = new String[] {"젤리빈", "킷캣", "롤리팝" };
    AlertDialog.Builder dlg = new AlertDialog.Builder(액티비티명.this);
    dlg.setTitle("좋아하는 버전은?");
    dlg.setIcon(R.drawable.ic_launcher);
    dlg.setItems(versionArray, 
    	new DialogInterface.OnClickListener(){
        	public void onClick(DialogInterface dialog, int which) {
            	button1.setText(versionArray[which]);
            }
        });
    dlg.setPositiveButton("닫기", null);
    dlg.show();
   }
728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

토스트 Toast


화면에 잠깐 나타났다 사라지는 메시지로 프로그래머가 디버깅 용도로 사용하기에도 적당하다.

Toast.makeText(Context context, String message, int duraion).show();

setGriavity() 메소드를 사용하면 위치를 변경할 수 있음

Toast.setGravity(int gravity, init xOffset, int yOffset);

 

 

7-12 예제 (XML 코드)

<LinearLayout
	android:gravity="center">
    
    <Button
    	android:id="@+id/button1"
        android:text="메세지출력" />
</LinearLayout>

 

Toast Java code

토스트는 자바에서 이렇게 작성한다.

public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setTitle("토스트 연습");
    
    final Button button1 = (Button) findViewById(R.id.button1);
    
    button1.setOnClickListener (new View.OnClickListener() {
    	public void onClick(View v) {
        	Toast tMSG = Toast.makeText(액티비티명.this, "토스트 연습",
            	Toast.LENGTH_SHORT);
                
            Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
            int xOffset = (int)(Math.random()*display.getWidth());
            int yOffset = (int)(Math.random()*display.getWidth());
            
            tMsg.setGravity(Gravity.TOP:Gravity.LEFT, xOffset, yOffset);
            tMsg.show();
            }
	});
}           	
728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

안드로이드 메뉴는 옵션 메뉴와 컨텍스트 메뉴 두 가지로 분류된다.
각각의 특징에 대해 실습과 함께 개념을 알아보자.

 

 

 

1) 옵션 메뉴


메뉴 xml 파일 생성 후 java에서 호출한다. java 코드만으로 메뉴를 생성하는 방법.

 

* XML을 이용한 옵션 메뉴

메뉴 코딩 - > 메뉴 파일 등록  -> 메뉴 선택 시 작동할 내용 코딩

 

1 xml 파일 형식

<menu>
	<item
    	android:id="@+id/항목1아이디"
        android:title="항목1 제목" />
    <item
    	android:id="@+id/항목2아이디"
        android:title="항목2 제목" />
</menu>

 

2 onCreateOptionMenu() 메소드

Inflater : 스쿠버다이빙에서 바람을 넣는 용도로 쓰는데 팽창시키겠다는 뉘앙스. activity를 기본으로 가지고 있고 메뉴 등을 넣을 때 쓴다. Inflater 객체에서 Inflater메소드를 가지고 새로운 것에 화면을 연결해 주는 것이다.
정적으로 존재하는 XML파일을 Java 코드에서 접근하여 실제 객체로 만들어 사용하는 것
메뉴 인플레이터 개체는 메뉴 XML 파일을 자바 코드에서 가져와 사용하는 것이고 레이아웃 인플레이터는 레이아웃 XML파일을 자바코드에서 가져와 사용하는 것이다.

public boolean onCreateOptionsMenu(Menu menu) {
	super.onCreateOptionsMenu(menu);
    MenuInflater mInflater = getMenuInflater();
    mInflater.inflate(R.menu.메뉴XML아이디, menu);
    return true;
}

 

3 onOptionsItemSelected() 메소드 

public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
    case R.id.항목1아이디:
    	항목 1을 선택했을 때 실행할 코드
        return true;
    case R.id.항목2아이디:
    	항목 2을 선택했을 때 실행할 코드
        return true;
    }
    return false;
 }

 

 

실습하기

7-1. 배경색 변경 앱 만들기 (Project7_1, com.cookandroid.project7_1)

 

1) 화면 디자인 : 바깥 리니어레이아웃의 id를 baseLayout으로 지정하며 텍스트뷰 1개와 버튼 1개 생성, 버튼 id는 button1로 한다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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:id="@+id/baseLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="키패드의 MENU 버튼을 누르세요"
        android:textSize="20dp"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:text="이전 버튼"/>
</LinearLayout>

 

menu1.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <item
        android:id="@+id/itemRed"
        android:title="배경색(빨강)">
    </item>
    <item
        android:id="@+id/itemGreen"
        android:title="배경색(초록)">
    </item>
    <item
        android:id="@+id/itemBlue"
        android:title="배경색(파랑)">
    </item>
    <item
        android:title="버튼 변경 >>">
            <menu>
                <item
                    android:id="@+id/subRotate"
                    android:title="버튼 45도 회전" />
                <item
                    android:id="@+id/subSize"
                    android:title="버튼 2배 확대" />
            </menu>
    </item>
</menu>

 

 

자바 코드 수정 : activity_main.xml의 레이아웃과 버튼에 대응할 전역변수 2개와 메인함수 onCreate()안에서 위젯 변수 2개에 위젯을 대입한다. onCreateOptionsMenu()를 Activity 클래스로부터 오버라이드한다. 자동완성된 코드에 나머지를 채워 완성한다. onOptionsItemSelected()는 메뉴를 클릭했을 때 동작할 메소드를 코딩한다.

 

 

package com.example.myapplication7;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;

public class MainActivity extends Activity {
    LinearLayout baseLayout;
    Button button1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("배경색 바꾸기");

        baseLayout = (LinearLayout) findViewById(R.id.baseLayout);
        button1 = (Button) findViewById(R.id.button1);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater mInflater = getMenuInflater();
        mInflater.inflate(R.menu.menu1, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.itemRed:
                baseLayout.setBackgroundColor(Color.RED);
                return true;
            case R.id.itemBlue:
                baseLayout.setBackgroundColor(Color.BLUE);
                return true;
            case R.id.itemGreen:
                baseLayout.setBackgroundColor(Color.GREEN);
                return true;
            case R.id.subRotate:
                button1.setRotation(45);
                return true;
            case R.id.subSize:
                button1.setScaleX(2);
                return true;
        }
        return false;
    }
}

 

위 예제를 자바코드로만 코딩하려면, onCreateOptionsMenu() 메소드 안에서 메뉴 XML 파일에 접근하는 대신에 직접 Menu.add() 메소드로 메뉴 항목을 추가한다.

 

 

추가적으로 위 예제 실습 7-1을 변경해보자.

 

 


 

2) 컨텍스트 메뉴

컨텍스트는 구문, 명령이라는 뜻인데 메뉴가 정해지지 않고 대상에 따라 특화되어 나오는 메뉴를 말한다.
레이아웃 또는 버튼, 에디트텍스트 등의 위젯을 롱클릭하면 나타나는 Windows의 팝업창과 비슷

 

컨텍스트 메뉴가 나오게 할 위젯마다 별도의 파일로 만들어야 하며 메뉴 XML문법은 옵션 메뉴와 동일하다.
onCreateContextMenu() 메소드에는 위젯별로 컨텍스트 메뉴가 나타나야 하므로, 위젯별 컨텍스트 메뉴를 if문으로 등록한다. 

 

public void onCreateContextMenu(ContextMenu menu,
			View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        
        MenuInflater mInflater = getMenuInflater();
        if(v==위젯1) {
        	mInflater.inflate(R.menu.첫번째메뉴XML파일, menu);
		}
        if(v==위젯2) {
        	mInflater.inflate(R.menu.두번째메뉴XML파일, menu);
        }
}

 

* 프로젝트명 : Project7_2
* 패키지명 : com.cookandroid.project7_2
* 레이아웃 id : baseLayout
* 버튼은 2개 생성
하며 id는 button1, button2로 한다.

<LinearLayout
	android:gravity="center_horizontal"
	<Button
    	android:id="@+id/button1"
        android:text="배경색 변경" />
    <Button
    	android:id="@+id/button2"
        android:text="버튼 변경" />
</LinearLayout>     

 

menu1.xml은 배경색 변경과 관련된 3개의 항목을, menu2.xml은 버튼과 관련된 2개의 항목을 생성한다.

//menu1.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item
    	android:id="@+id/itemRed"
        android:title="배경색(빨강)">
    </item>
    <item
    	android:id="@+id/itemBlue"
        android:title="배경색(파랑)">
    </item>
    <item
    	android:id="@+id/itemGreen"
        android:title="배경색(초록)">
    </item>
</menu>
//menu2.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item
    	android:id="@+id/subRotate"
        android:title="버튼 45도 회전">
    </item>
    <item
    	android:id="@+id/subSize"
        android:title="버튼 2개 확대">
    </item>
</menu>

 

자바 코드 : activity_main.xml 의 레이아웃과 버튼 2개에 대응할 전역변수 3개, 메인 함수 onCreate() 안에서 위젯 변수 3개에 위젯을 대입한다. 2개의 버튼 위젯 변수를 registerForContextMenu() 에 등록한다.

 

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
	super.onCreateContextMenu(menu, v, menuInfo);
    
    MenuInflater mInflater = getMenuInflater();
    if(v==button1) {
    	menu.setHeaderTitle("배경색 변경");
        menu.setHeaderIcon(R.drawble.icon1);
        mInflater.inflate(R.menu.menu1, menu);
        }
    if(v==button2) {
    	mInflater.inflate(R.menu.menu2, menu);
    }
}

 

실습 7-2에서 실습한 컨텍스트 메뉴를 XML파일 없이 Java코드로만 완성해보자.

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

뷰 컨테이너


 

1. 스크롤뷰

스크롤뷰는 수직으로 스크롤하는 기능으로 수평스크롤뷰는 HorizontalScrollView라고 있다.
스크롤뷰에는 단 하나의 위젯만 넣을 수 있는 것을 주의.

<ScrollView x

 

 

2. 슬라이딩드로어

SlidingDrawer는 서랍을 뜻하는 말로 위젯들을 서랍처럼 열어서 보여주거나 닫아서 감춘다.

ㄴㅇㄹㄴㅇㄹ

 

 

3. 뷰플리퍼

안에 여러 개의 위젯을 배치한 후 필요에 따라서 화면을 왼쪽과 오른쪽으로 밀어서 하나의 위젯씩 화면에 보여주는 방식의 뷰 컨테이너

 

 

4. 탭호스트

여러 탭을 두고 각 탭을 클릭할 때마다 해당 화면이 나오도록 설정하는 뷰 컨테이너

444

 

 

5. 액션바

Action Bar는 허니콤(Android 3.0, API 11)에서 태블릿과 같은 대형 화면에서 여러 화면을 사용하기 위해서 고안되어 태블릿, 스마트폰 등 다양한 크기의 화면을 디자인하는 데 활용된다.

55555

 

 

6. 프래그먼트

액티비티보다 작은 단위의 화면으로 프래그먼트를 사용하면 대형화면에서 액티비티 화면을 분할해서 표현 가능하다. 스마트폰과 같은 소형화면에서는 화면의 분할보다는 실행 중에 화면을 동적으로 추가, 제거하는데 더 많이 활용된다.

4444

 

 

7. 웹뷰

사용자가 웹브라우저 기능(브라우저엔진(웹킷)을 앱 안에 직접 포함시킬 수 있는 위젯. 뷰의 일종.
한 줄만 입력하면 인터넷의 url주소줄을 준다. 다만 인터넷을 연결하는 데 AndroidManifest.xml 파일에서 수정하여 인터넷 사용 권한 설정이 필요하다. 그리고 며칠 전부터 업그레이드가 되어 이 한 줄 외에도 더 추가가 필요하다고 함...

4444

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,
728x90
728x90

안드로이드 고급 위젯

이번 시간에는 저번에 이어서 안드로이드의 고급 위젯에 대해 알아보도록 할 건데,
고급 위젯이라고 해서 어렵다기보다 부가적인 기능 정도로 이해하면 될 듯 함

 

1. 아날로그 시계, 디지털 시계 예제

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">
    <AnalogClock
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    <DigitalClock
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"/>
</LinearLayout>

 

 

2. 크로노미터 (Chronometer)

타이머 형식의 위젯으로 일반적으로 시간을 측정할 때 많이 사용.
손목시계에 관심 많은 분들은 많이 들어봤을 단어.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
    <Chronometer
            android:id="@+id/chronometer1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:format="시간 측정 : %s"
            android:gravity="center"
            android:textSize="30dp"/>
</LinearLayout>

 

 

3. 타임피커, 데이트피커, 캘린더뷰

타임피커 : 시간을 표시, 조절
데이트피커와 캘린더뷰 : 날짜
를 표시, 조절

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">
    <Timepicker
            android:layout_width="match_parent"
            android:layout_height="120dp" />
    <DatePicker
            android:layout_width="match_parent"
            android:layout_height="120dp" />
    <CalendarView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:showWeekNumber="false"/>
</LinearLayout>

 

 

4. 자동완성텍스트뷰와 멀티자동완성텍스트뷰

단어의 일부만 입력해도 자동완성 시켜주는 기능. 앞은 1개, 멀티는 쉼표로 구분하여 자동완성

<LinearLayout>
	<AutoCompleteTextView
    	android:id="@+id/autoCompleteTextView1"
        android:completionHint="선택하세요"
        android:completionThreshold="2"
        android:hint="자동완성텍스트뷰">
    </AutoCompleteTextView>
    <MultiAutoCompleteTextView
    	android:id="@+id/multiautoCompleteTextView1"
        android:completionHint="선택하세요"
        android:completionThreshold="2"
        android:hint="멀티자동완성텍스트뷰" />
</LinearLayout>

 

자바 코드

 

 

 

5. 프로그래스바, 시크바, 래이팅바

프로그래스바 : 작업 진행 상황을 바나 원 형태로 제공
시크바 SeekBar : 
프로그래스 바와 비슷하며 사용자 터치로 임의 조절 가능 (입력값을 받을 수도 있다)
래이팅 바 RatingBar :
진행 상황을 별 모양으로 표시. 별점

<LinearLayout>
	<ProgressBar
    	style="?android:attr/progressBarStyleHorizontal"
        android:max="100"
        android:progress="20"
        android:secondaryProgress="50" />
     <SeekBar
        android:progress="20" />
     <RatingBar
     	android:numStars="5"
        android:rating="1.5"
        android:stepSize="0.5" />
</LinearLayout>

 

 


 

실습하기

 

6-1. 날짜/시간 예약 앱 만들기 (프로젝트명 : Project6-1)

 

xml 코드

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <Chronometer
            android:id="@+id/chronometer1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:format="예약에 걸린 시간 %s"
            android:gravity="center"
            android:textSize="20dp"
            />
        <Button
            android:id="@+id/btnStart"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="예약 시작"/>
    </LinearLayout>

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <RadioButton
            android:id="@+id/rdoCal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="날짜 설정(캘린더뷰)"/>
        <RadioButton
            android:id="@+id/rdoTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="시간 설정"/>
    </RadioGroup>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center">
            <CalendarView
                android:id="@+id/calendarView1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:showWeekNumber="false" />
            <TimePicker
                android:id="@+id/timePicker1"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </FrameLayout>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#cccccc">
        <Button
            android:id="@+id/btnEnd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="예약완료"/>
        <TextView
            android:id="@+id/tvYear"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0000"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="년"/>

        <TextView
            android:id="@+id/tvMonth"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="00"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="월"/>

        <TextView
            android:id="@+id/tvDay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="00"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="일"/>
        <TextView
            android:id="@+id/tvHour"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="00"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="시"/>
        <TextView
            android:id="@+id/tvMinute"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="00"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="분 예약됨"/>
    </LinearLayout>
</LinearLayout>

 

 

자바 코드

* xml에서 id를 부여한 위젯에 대응할 위젯 변수 12개의 전역변수 선언
* 12개 위젯 변수에 위젯을 대입하고 처음에는 캘린더뷰와 타임피커가 보이지 않게 설정
* 라디오버튼 클릭 시 캘린더뷰와 타임피커 중 하나씩만 보이게 클릭 이벤트 리스너 작성
* 예약 시작을 클릭하면 크로노미터가 시작되고 예약완료를 클릭하면 정지하도록 클릭이벤트 리스너를 작성
* 예약 완료를 클릭하면 캘린더뷰에서 설정한 연, 월, 일과 타임피커에서 설정한 시, 분이 맨아래 텍스트뷰에 채워지게 함

package com.example.project6_1;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.Chronometer;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.TimePicker;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {
    Chronometer chrono;
    Button btnStart, btnEnd;
    RadioButton rdoCal, rdoTime;
    CalendarView calView;
    TimePicker tPicker;
    TextView tvYear, tvMonth, tvDay, tvHour, tvMinute;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        setContentView(R.layout.ex06_04);
        setTitle("시간예약");
        btnStart=(Button) findViewById(R.id.btnStart);
        btnEnd=(Button) findViewById(R.id.btnEnd);

        chrono = (Chronometer) findViewById(R.id.chronometer1);
        rdoCal = (RadioButton) findViewById(R.id.rdoCal);
        rdoTime = (RadioButton) findViewById(R.id.rdoTime);

        tPicker = (TimePicker) findViewById(R.id.timePicker1);
        calView = (CalendarView) findViewById(R.id.calendarView1);

        tvYear = (TextView) findViewById(R.id.tvYear);
        tvMonth= (TextView) findViewById(R.id.tvMonth);
        tvDay = (TextView) findViewById(R.id.tvDay);
        tvHour = (TextView) findViewById(R.id.tvHour);
        tvMinute = (TextView) findViewById(R.id.tvMinute);

        tPicker.setVisibility(View.INVISIBLE);
        calView.setVisibility(View.INVISIBLE);

        //라디오버튼 클릭 시 캘린더뷰와 타임피커 중 하나씩만 보이게 클릭 이벤트 리스너
        rdoCal.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                tPicker.setVisibility(View.INVISIBLE);
                calView.setVisibility(View.VISIBLE);
            }
        });
        rdoTime.setOnClickListener(new View.OnClickListener(){
            public void onClick(View view){
                tPicker.setVisibility(View.VISIBLE);
                calView.setVisibility(View.INVISIBLE);
            }
        });
        // 예약 시작 클릭 시 크로노미터 동작, 그 반대 정지
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                chrono.setBase(SystemClock.elapsedRealtime());
                chrono.start();
                chrono.setTextColor(Color.RED);
            }
        });
        btnEnd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                chrono.stop();
                chrono.setTextColor(Color.BLUE);
            }
        });
        //예약완료 클릭 시 그 내용이 텍스트뷰에 채워지게 함
        java.util.Calendar curDate = java.util.Calendar.getInstance();
        curDate.setTimeInMillis(calView.getDate());

        tvYear.setText(Integer.toString(curDate.get(Calendar.YEAR)));
        tvMonth.setText(Integer.toString(curDate.get(Calendar.MONTH)));
        tvDay.setText(Integer.toString(curDate.get(Calendar.DATE)));

        tvHour.setText(Integer.toString(tPicker.getCurrentHour()));
        tvMinute.setText(Integer.toString(tPicker.getCurrentMinute()));

    }
}

 

다 완성하면 캘린더뷰 대신에 데이트피커를 사용해서 날짜를 설정해보고 예약 시작과 예약 완료는 없앤 후 대신 크로노미터를 클릭하면 예약이 되게, 예약 완료는 아래쪽 연도를 길게 클릭하면 동작하도록 한다. 크로노미터를 클릭하기 전에는 라디오버튼, 데이트피커, 타임피커가 안 보이도록 설정하고, 크로노미터를 클릭하면 라디어버튼이 나타나도록 한다. 또 아래쪽 연도를 롱클릭하면 라디오버튼, 데이트피커, 타임피커가 다시 사라진다.

 

 

ㅁㅇㄴㄹ

 

 

 

6-2. 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v