●소켓

- 일상 용어에서는 전구를 끼울 수 있는 도구를 말한다. 자바언어에서는 네트워크를 제어하는 클래스를 의미한다.

자바에서는 개발자가 네트워크 전문지식이 없어도 프로그래밍적으로 제어가 가능하도록 추상화시켜 제공해준다.



●예제


서버

- ChatServer.java

package chat;


import java.io.IOException;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Vector;


public class ChatServer {

//서버소켓 - 클라이언트의 접속을 받아들이는 클래스

int port=7777;

ServerSocket server;

Vector<ServerThread> connectList;

public ChatServer() {

connectList = new Vector<ServerThread>();

try {

//서버객체 생성

server = new ServerSocket(port);

while(true){

//접속자가 접속하는지 확인

//접속자가 있을때까지 대기,지연상태에 있다.

Socket client = server.accept();

InetAddress inet = client.getInetAddress();

String ip = inet.getHostAddress();

System.out.println(ip+"-접속자 발견");

//대화용 쓰레드 생성 및 소켓

ServerThread serverThread = new ServerThread(connectList, client);

System.out.println("start");

serverThread.start();

connectList.add(serverThread);

System.out.println("현재 접속자수:"+connectList.size());

}

/*

//클라이언트의 메세지를 받아들여보자(입력)

InputStream is = client.getInputStream();

//한글이 지원되지 않으므로 2바이트씩 처리하는 스트림으로 업그레이드

InputStreamReader reader;//문자기반스트림(2바이트씩 처리)

reader = new InputStreamReader(is);

//문자단위로 데이터를 처리하면 효율상 떨어지므로

//버퍼스트림으로 업그레이드

//버퍼처리된 문자기반 스트림

BufferedReader buffer = new BufferedReader(reader);

//클라이언트가 보낸 메시지를 출력해보자(출력)

OutputStream os = client.getOutputStream();

//문자기반 출력스트림

OutputStreamWriter writer = new OutputStreamWriter(os);

//버퍼처리된 문자기반 출력 스트림

BufferedWriter bufferWriter = new BufferedWriter(writer);

//int data;

String data;

while(true){

//클라이언트에서 메시지를 받는다.

//data = is.read();

//data = reader.read();

data = buffer.readLine();

//System.out.print((char)data);

System.out.println(data);

//클라이언트에게 메시지를 보낸다.

//os.write((char)data);

//os.write(data);

bufferWriter.write(data+"\n");

//출력스트림안의 데이터를 비우는것이다.

//혹시라도 남아있을수 있는 데이터를 전부 내보냄

//os.flush();

bufferWriter.flush();

}*/

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

new ChatServer();

//server = new ServerSocket(port);

}

}

 



- ServerThread.java

package chat;


import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.net.Socket;

import java.util.Vector;


public class ServerThread extends Thread{

Socket client;

BufferedReader buffer;

BufferedWriter bufferWriter;

Vector<ServerThread> connectList;

public ServerThread(Vector<ServerThread> connectList, Socket socket) {

this.connectList = connectList;

this.client = socket;

try {

buffer = new BufferedReader(new InputStreamReader((client.getInputStream())));

bufferWriter = new BufferedWriter(new OutputStreamWriter((client.getOutputStream())));

} catch (IOException e) {

e.printStackTrace();

}

}

public void run() {

while(true){

String msg = listen();

send(msg);

}

}

//메시지 청취

public String listen(){

String msg="";

try {

msg= buffer.readLine();

System.out.println("msg:"+msg);

} catch (IOException e) {

e.printStackTrace();

}

return msg;

}

//메시지 전송

public void send(String msg){

try {

for(int i=0;i<connectList.size();i++){

ServerThread st = connectList.get(i);

st.bufferWriter.write(msg+"\n");

st.bufferWriter.flush();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

 



자바 클라이언트

- ChatClient.java

package chat;


import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;

import java.net.UnknownHostException;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;


//윈도우창은 개발자가 명시하지 않으면 디폴트로 BorderLayout이 적용된다.

public class ChatClient extends JFrame implements ActionListener,KeyListener{

JButton btn;

JTextArea area;

JScrollPane scoll;

JTextField input;

Socket client; //대화형 소켓

String ip = "192.168.100.95";

int port = 7777;


BufferedReader bufferR;

BufferedWriter bufferW;

public ChatClient() {

btn = new JButton("접속");

area = new JTextArea();

scoll = new JScrollPane(area);

input = new  JTextField();

btn.addActionListener(this);

input.addKeyListener(this);

this.add(btn, BorderLayout.NORTH);

this.add(scoll);

this.add(input,BorderLayout.SOUTH);

setSize(300,400);

setVisible(true);

}

//채팅서버에 접속

public void connect(){

try {

client = new Socket(ip, port);

//연결된 소켓으로부터 대화를 나눌 스트림을 얻자

bufferR = new BufferedReader(new InputStreamReader(client.getInputStream()));

bufferW = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

//서버에 메시지 보내기

public void listen(){

String msg="";

try {

msg = bufferR.readLine();

area.append(msg+"\n");

} catch (IOException e) {

e.printStackTrace();

}

}

//서버에서 메시지 청취하기

public void send(){

String v = input.getText();

try {

bufferW.write(v+"\n");

bufferW.flush();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void actionPerformed(ActionEvent e) {

System.out.println("클릭");

connect();

}

public static void main(String[] args) {

new ChatClient();

}

//키를 누르골 있을때

public void keyPressed(KeyEvent e) {

}

//키를 눌렀다 땠을때

public void keyReleased(KeyEvent e) {

System.out.println("키:"+e.getKeyCode());

if(e.getKeyCode()==KeyEvent.VK_ENTER){

System.out.println("엔터");

send();

input.setText("");

listen();

}

}

//타이핑하면

public void keyTyped(KeyEvent e) {

}


}

 



안드로이드 클라이언트

- MainActivity.java

package com.example.chatclient;


import java.io.IOException;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Vector;


import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;


public class MainActivity extends Activity implements OnClickListener{

Button btn;

TextView textView;

EditText editText;

Button btn_send;

Socket client;

String ip = "192.168.100.95";

int port = 7777;

Thread thread;

ClientThread clientThread;

Handler handler;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


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

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

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

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

handler = new Handler(){

public void handleMessage(Message msg) {

super.handleMessage(msg);

Bundle bundle = msg.getData();

textView.append(bundle.getString("msg")+"\n");

}

};

btn.setOnClickListener(this);

btn_send.setOnClickListener(this);

}

public void connect(){

thread = new Thread(){

public void run() {

super.run();

try {

client = new Socket(ip, port);

clientThread = new ClientThread(client, handler);

clientThread.start();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

};

thread.start();

}

@Override

public void onClick(View v) {

if(v.getId()==R.id.btn){

connect();

}

if(v.getId()==R.id.btn_send){

clientThread.send(editText.getText().toString());

editText.setText("");

}

}

}

 



- ClientThread.java

package com.example.chatclient;


import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;


import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.widget.TextView;


public class ClientThread extends Thread{


BufferedReader bufferR;

BufferedWriter bufferW;

Socket client;

Handler handler;


public ClientThread(Socket client, Handler handler) {

this.handler = handler;

try {

this.client = client;

//연결된 소켓으로부터 대화를 나눌 스트림을 얻음

bufferR = new BufferedReader(new InputStreamReader(client.getInputStream()));

bufferW = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));

} catch (IOException e) {

e.printStackTrace();

}

}

//보내기

public void send(String data){

System.out.println("전송");

try {


System.out.println("data:"+data);

bufferW.write(data+"\n");

bufferW.flush();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//받기

public String listen(){

String msg=null;

try {

while(true){

msg=bufferR.readLine();

Message m = new Message();

Bundle bundle = new Bundle();

bundle.putString("msg", msg);

m.setData(bundle);

handler.sendMessage(m);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return msg;

}

public void run() {

super.run();

listen();

}

}

 



- activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   

 xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/LinearLayout1"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    tools:context="${relativePackage}.${activityClass}" >


    <Button 

        android:id="@+id/btn"

        android:layout_width="wrap_content"

        android:layout_height="0dp"

        android:text="접속"

        android:layout_weight="1"

        android:layout_gravity="center_horizontal"/>

    

<TextView 

   android:id="@+id/textView"

   android:layout_width="match_parent"

   android:layout_height="0dp"

        android:layout_weight="10"/>    

    

    

    

    <EditText 

        android:id="@+id/editText"

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:background="#ffdd00"

        android:layout_weight="1"/>

    

    <Button 

        android:id="@+id/btn_send"

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:text="전송"

        android:layout_weight="1"

        android:layout_gravity="center_horizontal"/>

    

    


</LinearLayout>

 








Posted by -현's-

댓글을 달아 주세요


●자바스크립트 JSON(JavaScript Object Notation)

- JSON은 원래 자바스크립트 데이터 객체이다.


- JSON이란 데이터를 표현함에 있어 xml보다 더욱 단순하고 객체 표현방식이 기존의 개발자들에 익숙한 {객체표기법}을 따르므로 데이터 처리가 쉽다.





●예제

- text.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR" 

   pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script>


var rabbit = {

name:"토끼",

age:"22",

like:["당근","풀"],

isBool:true,

father:{

name:"토끼아빠",

age:"50"

},

friend:[

   {

name:"토끼친구1",

age:"22"

},

{

name:"토끼친구2",

age:"22"

}

]

}

document.write("이름:"+rabbit.name+"<br>");

document.write("나이:"+rabbit.age+"<br>");

document.write("논리:"+rabbit.isBool+"<br>");

document.write("like1:"+rabbit.like[0]+"<br>");

document.write("like2:"+rabbit.like[1]+"<br>");

document.write("아빠이름:"+rabbit.father.name+"<br>");

document.write("아빠나이:"+rabbit.father.age+"<br>");

document.write("친구1:"+rabbit.friend[0].name+"<br>");

document.write("친구2:"+rabbit.friend[1].name+"<br>");


</script>

</head>

<body>

</body>

</html> 








Posted by -현's-

댓글을 달아 주세요


●안드로이드 JSON

- 안드로이드에서는 별도로 라이브러리를 추가할 필요없이 JSONObject, JSONArray 클래스를 사용하면 된다.







●예제

- MainActivity.java

package com.example.exam;


import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.widget.Toast;


public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


           //JSON만들기

JSONObject jobj = new JSONObject();

        try {

 jobj.put("이름", "호랑이");

       jobj.put("나이", "10");

       jobj.put("직업", "동물");

} catch (JSONException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

        JSONArray maglist = new JSONArray();

        maglist.put(jobj);

        maglist.put(jobj);

        maglist.put(jobj);


JSONObject jobj2 = new JSONObject();

try {

jobj2.put("arr",maglist);

} catch (JSONException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

System.out.println("jobj:"+jobj);

System.out.println("maglist:"+maglist);

System.out.println("jobj2:"+jobj2);

//JSON 해석하기

JSONObject obj;

try {

obj = new JSONObject(jobj2.toString());


JSONArray array = obj.getJSONArray("arr");

JSONObject dataObj = array.getJSONObject(0);


String friendName = dataObj.getString("이름");

String friendAge = dataObj.getString("나이");

System.out.println("friendName:"+friendName);

System.out.println("friendAge:"+friendAge);

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

 








Posted by -현's-

댓글을 달아 주세요


●뷰페이저인디케이터(ViewPagerIndicator)

- 뷰페이저 화면이 이동할대 탭으로 해당 페이지가 어디에 위치해 있는지 알려준다.

예)카카오톡 상단 탭 효과


- 아래 페이지에서 라이브러리를 다운 받은후 이클립스에 import해준다.

http://viewpagerindicator.com/ 


- library프로젝트 우클릭후 properties에 들어가서 좌측android탭에서 is Library에 체크해준다.





뷰페이저인디케이터 sample앱 추가

- 먼저 다운받은 라이브러리 압축을 푼후 library폴더를 이클립스에 import해준다. 

(이 라이브러리를 사용할 프로젝트와 같은 workspace에 추가해야한다.)


- library프로젝트 우클릭후 properties에 들어가서 좌측android탭에서 is Library에 체크해준다.




- sample폴더를 이클립스에 import한후 프로젝트를 실행한다.













Posted by -현's-

댓글을 달아 주세요


●sqlite

- 안드로이드 로컬에서 사용하는 database이다. 


실제 스마트폰 단말기 내의 data/data/database경로에 파일이 만들어지게된다.

에뮬레이터를 실행하고 DDMS에 들어가면 파일 구조를 볼수 있다.(실제 핸드폰으로 연결하면 파일구조를 다 보지 못하도록 막혀있다.)


- 안드로이드 스마트폰은 보안상 접근을 허용하지 않는다. 따라서 개발자가 만일 sqlite 파일등을 스마트폰에 넣으려 할때, gui모드로 지원되는 DDMS는 사용할 수 없다.DDMS는 에뮬레이터에서만 의미가 있다. 안드로이드의 sqlite 관련 패키지에는 개발자가 데이터베이스 관리할 수 있는 여러 객체들을 지원해주므로, 실제 개발시엔 GUI모드로 하지말고 프로그래밍으로 처리한다.







●예제


DatabaseMain.java

package study.db;


import com.example.day0404.R;


import android.app.Activity;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.widget.TextView;


public class DatabaseMain extends Activity{

String a="";

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.test);

//데이터베이스 구축 전담 객체를 사용하여 sqlite db를 생성

MyOpenHelper helper = new MyOpenHelper(this);

TextView tb = (TextView)findViewById(R.id.a);

//생성자 호출만으로는 db구축이 안되고 있다.

//실제 db구축이 되는 시점은 SQLiteDatabase객체를 

//얻기위해 호출되는 메서드인 getReadableDatabase(), 

//getWritableDatabase()메서드를 호출하는 시점이다.

//실제 스마트폰 단말기 내의 data/data/database경로에 파일이 만들어지게된다.

SQLiteDatabase db = helper.getWritableDatabase();

db.execSQL("insert into member(name, money, etc) values ('apple', 10000, 'a');");

//데이터데이스의 데이터를 그대로 메모리상에 올려놓은 객체자 Cursor이다.

Cursor rs = db.rawQuery("select * from member;", null);

while(rs.moveToNext()){

System.out.println("데이터있음:"+rs.getString(0));

a = a+rs.getString(0);

}

tb.setText(a);

}

}

 



MyOpenHelper.java

package study.db;


import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;

import android.widget.Toast;


public class MyOpenHelper extends SQLiteOpenHelper{


Context context;

public MyOpenHelper(Context context) {

            //2번째 인자는 만들어지는 sqlite파일 이름이고 4번째 인자는 개발자가 만든 sqlite버전이다.

super(context, "data.sqlite", null, 1);

this.context = context;

}

//최초에 기존에 없었던 db가 새롭게 만들어질때 1번 호출

public void onCreate(SQLiteDatabase db) {

db.execSQL("CREATE TABLE member (name VARCHAR(20), money INTEGER, etc VARCHAR(50));");

}


//이미 배포했던 db에 변경이 있을경우 호출된다.

//주로 버전의 변경이 있을때 호출

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("CREATE TABLE member (name VARCHAR(20), money INTEGER, etc VARCHAR(50));");

}

}

 



- test.xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    

    <TextView android:id="@+id/a"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>


</LinearLayout>

 








Posted by -현's-

댓글을 달아 주세요



●인텐트(Intent)

- 하나의 앱을 구성하는 여러 액티비티간 데이터를 주고 받고 대상에게 무엇을 하려는지에 대한 '의도'를 전달할 목적으로 사용되는 객체이다.


- 인텐트 사용시 대상 액티비티를 정확히 명시하여 사용할 수 있는 인텐트를 명시적(explicit)인텐트라고 하고 대상을 정확히 명시하지 않고 사용하는 액티비티를 암시적(implicit)라고 한다.


- 명시적 인텐트는 앱내에서 내가 만든 액티비티를 호출할때 이용하고, 암시적 인텐트는 다른 앱을 호출할때 Action상수를 이용해서 호출한다.





●명시적 액티비티 예제


- A액티비티에서 B액티비티로 화면 이동하고 텍스트를 전달하는 예제


- a.xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    

    <Button 

        android:id="@+id/btn_open"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="다른 화면으로 이동"/>

    <EditText 

        android:id="@+id/et_msg"

        android:layout_width="300dp"

        android:layout_height="35dp"

        android:background="#ffdd00"

        />


</LinearLayout>




- ActivityA.java

package study;


import com.example.day0307.R;


import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;


public class ActivityA extends Activity implements OnClickListener{

EditText et_msg;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.a);

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

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

btn_open.setOnClickListener(this);

}

@Override

public void onClick(View v) {

//다른 액티비티를 호출할때 정확한 액티비티 클래스 이름까지 명시해야한다.

//이때 사용되는 객체가 Intent인데, Intent 사용시 특정 액티비티 클래스명으 명시적으로

//호출하는 방법을 가르켜 명시적 Intent라 한다.

//호출대상이 되는 클래스는 동적으로 지정할 수 있다.

Intent intent =new Intent(this, ActivityB.class);

//인텐트는 액티비티 호출할때만 사용하는 것이 아니라, 데이터 전달용도로도 사용가능하다.

intent.putExtra("msg", et_msg.getText().toString());

startActivity(intent);//다른 액티비티를 호출하는 매서드

}

}




- b.xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    

    <Button 

        android:id="@+id/btn_close"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="닫기"/>

    

    <TextView 

        android:id="@+id/tv_msg"

        android:layout_width="match_parent"

        android:layout_height="40dp"

        android:background="#aaaaaa"/>


</LinearLayout>




- ActivityB.java

package study;


import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;


import com.example.day0307.R;


public class ActivityB extends Activity implements OnClickListener{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.b);

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

btn_close.setOnClickListener(this);

//intent를 통해 넘겨준 데이터가 있다면, 그 데이터를 추출해서 화면에 보여준다.

//새롭게 메모리에 올린게 아니라  A에서 넘어온 intent이다.

Intent intent = this.getIntent();

String msg = intent.getStringExtra("msg");

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

tv_msg.setText(msg);

}


@Override

public void onClick(View v) {

this.finish(); //this는 생략 가능하다.

}

}













●암시적 인텐트


- 암시적 인텐트는 호출 대상이 정확하지 않아 호출자의 의도를 파악하려면 정보가 필요하다. 이때 사용되는 상수가 Action이다.


- Action상수는 안드로이드 시스템내에 정의되어있다.


- Action상수는 안드로이드 개발자 사이트에서 Intent를 정의한 API에서 찾으면 된다.









- call.xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    

    <Button 

        android:id="@+id/btn_call"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="전화걸기"/>


</LinearLayout>

 



- CallActivity.java

package study;


import com.example.day0307.R;


import android.app.Activity;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;


public class CallActivity extends Activity implements OnClickListener{

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.call);

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

btn_call.setOnClickListener(this);

}


@Override

public void onClick(View v) {

int id = v.getId();

if(id==R.id.btn_call){

//정확한 액티비티명을 명시하지 못할대 가장 어울리는 의도를 Action상수를 통해 보여햐한다.

//그러면 안드로이드가 알아서 분석해서 알맞는 앱을 띄워준다.

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:01012341234"));

startActivity(intent);

}

}

}

 









Posted by -현's-

댓글을 달아 주세요



●버튼클릭하면 숫자가 하나씩 증가하는 예제

- ex1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="${relativePackage}.${activityClass}" >


    <Button

        android:id="@+id/btn1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="숫자 증가" />


</RelativeLayout>




-MainActirity.java

package com.example.day0307;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;


public class MainActivity extends Activity implements OnClickListener{

int cnt=1;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//xml을 해석하여 위젯이 메모리에 올라옴

setContentView(R.layout.activity_main);

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

//자바에서는 이벤트 구현시 3단계로 이루어진다.

//1.리스너의 종류를 선택

//2.리스너가 보유한 메서드 재정의

//3.이벤트를 일으킨 이벤트 소스(위젯)과 리스너와의 연결

btn1.setOnClickListener(this);

}

//현재 클래스를 클릭을 감지하는 리스너로 정의했기 깨문에 클릭행위가 발생했을때 

//어떤 구현을 할지를 아래의 매서드에서 재정의 해야한다.

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

//숫자를 1씩 증가시켜 화면에 출력

cnt++;

Toast.makeText(this, "숫자:"+cnt, Toast.LENGTH_SHORT).show();

}

}

 









●버튼을 클릭하면 ImageView 의 이미지를 바꾸는 예제


- gallery.xml

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    

    <ImageView 

        android:id="@+id/imgView"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_marginLeft="30dp"

        android:layout_marginRight="30dp"

        android:src="@drawable/img0"/>

    <Button 

        android:id="@+id/backButton"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignLeft="@id/imgView"

        android:layout_alignBottom="@id/imgView"

        android:text="이전"/>

    <Button 

        android:id="@+id/forwardButton"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignRight="@id/imgView"

        android:layout_alignBottom="@id/imgView"

        android:text="다음"/>

</RelativeLayout>




- GalleryActivity.java

//자바에서의 클래스는 사물 자체가 아닌, 사물을 생성해낼 수 있는 틀을 정의하는것!

//개발자가 정의한 틀을 가리켜 클래스라 하고, 문자,숫자,논리값 이외의 새로운 객체자료형을 정의한 것고 같다.

//따라서 앞으로는 클래스는 자료형으로 봐야한다.

package study;


import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.Toast;


import com.example.day0307.R;


public class galleryActivity extends Activity implements OnClickListener{

ImageView imgView;

//갤러리와 같이 대량의 데이터를 순서대로 처리하는 경향이 강한 프로그램은

//대상 데이터를 변수명으로 처리하기 보다는 

//순서있는 데이터를 처리하기 위한 배열기법을 이용하는 것이 효율적이다.

int data[] = new int[7];

int cnt=0;

//액티비티의 생명주기중에서, 메모리에 최초에 올라올때 호출되는 메서드이다.

//따라서 개발자는 앱이 가동되자 마자 최초에 보게될 화면 수정을 해야한다.

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);


data[0] = R.drawable.img0;

data[1] = R.drawable.img1;

data[2] = R.drawable.img2;

data[3] = R.drawable.img3;

data[4] = R.drawable.img4;

data[5] = R.drawable.img5;

data[6] = R.drawable.img6;

//화면 호출

setContentView(R.layout.gallery);

//이미 xml에 의해 메모리에 올라온 기존 위젯을 참고

imgView = (ImageView)findViewById(R.id.imgView);

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

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

backButton.setOnClickListener(this);

forwardButton.setOnClickListener(this);

}

//다음 사진 나오는 메서드 정의

public void forward(){

if(cnt==data.length-1){

Toast.makeText(this, "마지막 사진입니다.", Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(this, "다음사진", Toast.LENGTH_SHORT).show();

cnt++;

imgView.setImageResource(data[cnt]);

}

}

//이전 사진 나오는 메서드 정의

public void back(){

if(cnt==0){

Toast.makeText(this, "첫 사진입니다.", Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(this, "이전사진", Toast.LENGTH_SHORT).show();

cnt--;

imgView.setImageResource(data[cnt]);

}

}


@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Log.i("my info", "v의 값"+v);

//이벤트를 일으킨 id값

int id = v.getId();

if(id==R.id.backButton){

back();

}

if(id==R.id.forwardButton){

forward();

}

}

}























Posted by -현's-

댓글을 달아 주세요



●그룹위젯인지 일반위젯인지 판단하는 방법


1. 위젯이 그룹인지 아닌지는 안드로이드 사이트의 api보고 판단한다. 안드로이드 개발자 사이트에 들어가서 위젯을 검색한다.

 ( http://developer.android.com/index.html )









2. Reference는 api문서이고 Guides는 사용하는 방법에 관한 페이지이다. Api를 확인하려면 Reference부분을 클릭한다.






3. 아래처럼 ViewGropu가 있으면 다른 위젯을 포함할수 있는 그룹위젯이고 ViewGroup가 없으면 일반 위젯이다.













●레이아웃의 종류

- Layout은 배치방법에 따라 LinearLayout, FrameLayout, GridLayout, RelativeLayout , TableLayout 등이 있다.

LinearLayout이 제일 많이 쓰이고,  LinearLayout,RelativeLayout  두가지를 적절히 활용하면 웬만한 화면은 구성할 수 있다.







layout_gravity  vs  gravity (정렬)

- layout_gravity - 자식이 부모위젯의 어디에 정렬할지 결정(자식한테 씀)


- gravity - 자식을 어디에 정렬시킬지(부모한테 씀)





●레이아웃xml 루트 Element 지정하는 두가지 방법


1.xml만들때 Root Element를 선택한다.





2.이미 xml을 만든 이후 Root Element를 변경하고 싶을땐, Graphical Layout모드로 들어가서 우클릭후 Change Layout을 눌러 레이아웃을 변경한다.











●LinearLayout 예제


- 예제1

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="버튼1"

        android:layout_gravity="center_horizontal" />


    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="버튼2"

        android:layout_gravity="left" />


    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="버튼3"

        android:layout_gravity="right" />


</LinearLayout>







- 예제2

->포함하는게 없느면 굳이 LinearLayout 쓸필요없고  View쓰면 된다.

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:layout_weight="1"

        android:orientation="horizontal" >

<!-- 왼쪽은 그냥 뷰 -->

        <View

            android:layout_width="0dp"

            android:layout_height="match_parent"

            android:layout_weight="1"

            android:background="#eeeedd" />

<!-- 우측은 LinearLayout -->

        <LinearLayout

            android:layout_width="0dp"

            android:layout_height="match_parent"

            android:layout_weight="1"

            android:orientation="vertical" >

            <View

                android:layout_width="match_parent"

                android:layout_height="0dp"

                android:layout_weight="1"

                android:background="#bbccee" />

            <View

                android:layout_width="match_parent"

                android:layout_height="0dp"

                android:layout_weight="1"

                android:background="#ffffff" />

        </LinearLayout>

    </LinearLayout>


    <View

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:layout_weight="1"

        android:background="#ff0000" >

    </View>


</LinearLayout>







- 예제3

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_margin="20dp"

        android:background="#ffddff" >

        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:layout_margin="20dp"

            android:background="#ecef00" >

            <View

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:layout_margin="20dp"

                android:background="#bbeecc" >

            </View>

        </LinearLayout>

    </LinearLayout>


</LinearLayout>









●FrameLayout예제


- 예제1

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

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/FrameLayout1"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    

    <Button android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="버튼1"

        android:background="#ffffff"/>

   

    <Button android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="버튼2"

        android:background="#edcf00"

        android:layout_marginLeft="40dp"

        android:layout_marginTop="30dp"/>

</FrameLayout>









●GridLayout예제

->이미지 확장자는 png를 많이 쓴다. 이유는 배경 투명이 가능하기 때문이다.gif도 투명배경 가능하지만 png가 화질이 더 좋다.

->res/drawalbe-hdpi,mdpi등 아무곳이나 넣어도 인식한다.


- 예제1

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <TextView

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_marginTop="30dp"

        android:gravity="center_horizontal"

        android:text="이미지목록"

        android:textSize="30dp" />


    <GridLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:columnCount="2"

        android:rowCount="1" >

<!-- rowCount 크게 의미없음 -->

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />


        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

        <ImageView

            android:layout_width="75dp"

            android:layout_height="75dp"

            android:src="@drawable/ic_launcher" />

    </GridLayout>


</LinearLayout>









●TableLayout예제


- 예제1

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

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/TableLayout1"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    

    

    <!-- 행을 표현하는 위젯 -->

    <TableRow 

        android:layout_width="match_parent"

        android:layout_height="wrap_content">

    <Button 

       android:layout_width="0dp"

       android:layout_height="wrap_content"

       android:text="1"

       android:layout_weight="1"/>    

    <Button 

       android:layout_width="0dp"

       android:layout_height="wrap_content"

       android:text="2"

       android:layout_weight="1"/>    

    <Button 

       android:layout_width="0dp"

       android:layout_height="wrap_content"

       android:text="3"

       android:layout_weight="1"/>   

    </TableRow>

    <TableRow >

    <Button 

       android:layout_width="0dp"

       android:layout_height="wrap_content"

       android:text="4"

       android:layout_weight="1"/>    

    <Button 

       android:layout_width="0dp"

       android:layout_height="wrap_content"

       android:text="5"

       android:layout_weight="1"/>    

    <Button 

       android:layout_width="0dp"

       android:layout_height="wrap_content"

       android:text="6"

       android:layout_weight="1"/>   

    </TableRow>

    <TableRow >

    <Button 

       android:layout_width="0dp"

       android:layout_height="wrap_content"

       android:text="7"

       android:layout_weight="1"/>    

    <Button 

       android:layout_width="0dp"

       android:layout_height="wrap_content"

       android:text="8"

       android:layout_weight="1"/>    

    <Button 

       android:layout_width="0dp"

       android:layout_height="wrap_content"

       android:text="9"

       android:layout_weight="1"/>   

    </TableRow>

    

    

    

</TableLayout>










●RelativeLayout예제

->기준에 따라 두가지로 분류

1.부모위젯을 기준으로

2.형제위젯을 기준으로


- 예제1

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/RelativeLayout1"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    

    <!-- 바깥쪽 위젯(부모)을 기준으로 하여 상대위치를 지정 -->

    

    <Button 

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="우측아래"

        android:layout_alignParentRight="true"

        android:layout_alignParentBottom="true"/>

    <Button 

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="중앙"

        android:layout_centerInParent="true"/>

    <Button 

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="좌측아래"

        android:layout_alignParentBottom="true"

        android:layout_alignParentLeft="true"/>

    <Button 

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="상단중앙"

        android:layout_alignParentTop="true"

        android:layout_centerHorizontal="true"/>

    

    

    

    

</RelativeLayout>










- 예제1

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    

    <!-- 특정 형제위젯을 기준으로 위치를 지정할 수 있는 상대 레이아웃 

   잘 알아두면 코드량이 현격이 줄어든다.(유용)-->

    

    

<Button 

   android:id="@+id/centerButton"

   android:layout_width="130dp"

   android:layout_height="100dp"

   android:text="중앙 버튼"

   android:layout_centerInParent="true"/>

<Button 

   android:layout_above="@id/centerButton"

   android:layout_alignLeft="@id/centerButton"

   android:layout_width="wrap_content"

   android:layout_height="wrap_content"

   android:text="버튼1"/>

<Button 

   android:layout_below="@id/centerButton"

   android:layout_alignRight="@id/centerButton"

   android:layout_width="wrap_content"

   android:layout_height="wrap_content"

   android:text="버튼2"/>

<Button 

   android:layout_alignTop="@id/centerButton"

   android:layout_toRightOf="@id/centerButton"

   android:layout_width="80dp"

   android:layout_height="wrap_content"

   android:text="버튼3"/>

</RelativeLayout>











●ScrollView예제

->ScrollView는 자식위젯을 하나만 둘수 있다.

->ScrollView는 세로방향만 된다. 가로ScrollView는 따로 있다.(HorizontalScrollView)


- 예제1

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:background="#ffdd00"

    android:gravity="center" >

    

    

    <Button 

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="닫기"/>

    <ScrollView  

        android:layout_width="match_parent"

        android:layout_height="match_parent">

        <LinearLayout 

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:orientation="vertical">

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   </LinearLayout>

    </ScrollView>

    

    


</LinearLayout>







●HorizontalScrollView예제


- 예제1

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:background="#ffdd00"

    android:gravity="center" >

    

    

    <Button 

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="닫기"/>

    <HorizontalScrollView  

        android:layout_width="match_parent"

        android:layout_height="match_parent">

        <LinearLayout 

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:orientation="horizontal">

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   <ImageView 

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:src="@drawable/ic_launcher"/>

   </LinearLayout>

    </HorizontalScrollView>

    

    


</LinearLayout>









●LinearLayout, EditText, Radio, ImageView 활용한 로그인 폼

->라디오 버튼은 라디오그룹으로 감싸야한다.


- 예제1

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" 

    android:padding="20dp">

    <!-- ID입력 -->

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" 

        android:layout_marginTop="100dp">

        <TextView 

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:text="ID"

            android:layout_weight="1"/>

        <EditText 

            android:maxLength="8"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:background="#ffdd00"/>

    </LinearLayout>

    <!-- PW입력 -->

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" 

        android:layout_marginTop="5dp">

        <TextView

           

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:text="비밀번호"

            android:layout_weight="1"/>

        <EditText 

            android:password="true"

            android:maxLength="8"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:background="#ffdd00"/>

    </LinearLayout>

    <!-- 성별선택 -->

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" 

        android:layout_marginTop="5dp">

        <TextView 

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:text="성별"

            android:layout_weight="1"/>

        <RadioGroup 

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:orientation="horizontal"

            android:layout_weight="1">

       <RadioButton  

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="남성"/>

       <RadioButton  

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="여성"/>

        </RadioGroup>

    </LinearLayout>

    <!-- 사진입력 -->

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" 

        android:layout_marginTop="5dp">

        <TextView 

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:text="사진"

            android:layout_weight="1"/>

        <ImageView  

            android:layout_width="100dp"

            android:layout_height="100dp"

            android:src="@drawable/ic_launcher"/>

    </LinearLayout>

    <!-- 버튼 -->

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" 

        android:layout_marginTop="5dp"

        android:gravity="center_horizontal">

        <Button 

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="가입"/>

        <Button 

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="취소"/>

    </LinearLayout>

    

    

    

    

    


</LinearLayout>


















Posted by -현's-

댓글을 달아 주세요



●pc에뮬레이터로 테스트하면 느리기 때문에 스마트폰과 pc를 연결 시킨후 스마트폰으로 테스트하는게 좋다.


1. 삼성 갤럭시의 경우 환경설정->개발자 옵션->USB디버깅에 체크를 해준다.




2. 삼성 갤럭시의 경우 삼성홈페이지에서 usb 드라이버를 다운받아 설치한다.

( http://local.sec.samsung.com/comLocal/support/down/kies_main.do?kind=usb )



3. 이클립스에서 상단 Run Configuration을 클릭한다.





4.왼쪽 Android Application 우클릭 후 new를 선택한다.





5.Browse..에서 프로젝트를 선택한다. 그리고나서 Name을 본인이 원하는 이름으로 변경한다.






6.Target 탭에서 첫번째 Always prompt to pick device를 선택하고 하단 Run을 누른다.





7. 본인의 스마트폰은 선택한후 OK를 누른다.







8. 기다리면 스마트폰에 개발한 앱화면이 나온다.













Posted by -현's-

댓글을 달아 주세요


●안드로이드 개발환경 세팅

1. java SDK 또는 JRE(Java Runtime Enviroment) - 개발툴을 실행하기 위한 Java VM

2. Android SDK - 개발에 필요한 안드로이드 라이브러리

3. 이클립스(Eclipse) - 개발툴

4. Developer Tools(ADT, Eclipse Plugin) - 개발에 필요한 이클립스 플러그인 형태의 개발도구

5. 이클립스 설정





1. java SDK 또는 JRE(Java Runtime Enviroment)

- 자바를 사용해서 개발하려면 반드시 java SDK가 설치되어 있어야 한다.


아래 주소에서 Java SE Development를 다운받아 설치한다

http://www.oracle.com/technetwork/java/javase/downloads/index.html


시스템 환경변수에서 "JAVA_HOME"을 설정한다

내컴퓨터->속성->설정변경->고급->환경변수->변수이름에 JAVA_HOME추가 변수값에 설치주소(ex. C:\myjava\jdk6) 추가


시스템 환경변수에 "PATH"에 "설치주소/bin"을 추가한다

ex) "C:\myjava\jdk6\bin"을 PATH변수값 제일 앞에 추가


④콘솔 명령 창에서 "java" 또는 "java -version"을 입력하여 정상적으로 출력되는지 확인한다

시작->실행->실행창에서 cmd입력 ->java 또는 java -version입력



2. Android SDK

- 안드로이드 개발을 하려면 반드시 안드로이드 SDK가 있어야 한다. 설치형과 바이너리형 두가지가 있는데 우선 바이너리형을 다운받는다.


아래 주소에서 Android SDK를 다운받아 압축을 푼다

http://developer.android.com/sdk/index.html





3. 이클립스(Eclipse)

- 원칙적으로 위 2번까지만 해도 안드로이드 개발이 가능하다. 개발 시간이 오래 걸릴 뿐이다. 개발의 편의성을 위해 이클립스를 다운 받는다.

요즘 안드로이드 스튜디오라는 자체 툴이 나와있지만 우선 이클립스를 다운받기로 한다.


아래 주소에서 "Eclipse IDE for Java Developer"를 다운받아 설치한다

http://www.eclipse.org/downloads/


('내컴퓨터->오른쪽버튼->속성'에 가면 32bit인지 63bit인지 알수 있다.)

(EE Developer는 웹개발용이다.)

(이클립스는 별도의 설치과정 필요 없이 그냥 압축만 해제하여 사용하면 된다.)



4. Developer Tools(ADT, Eclipse Plugin)

- 이클립스에서 안도르이드 개발을 도와주는 이클립스 플러그인이다.


이클립스를 실행한 후, 상단 메뉴에서 Help->Install New Software를 선택한다.


Work with 항목 우측의 "Add..." 버튼을 클릭한 후

Name에 "Android ADT", Location에 "https://dl-ssl.google.com/android/eclipse"를 입력한다


목록에서 "Android DDMS"와 "Android Developer Tools" 선택후 Next클릭

(목록에서 검색이 안될경우 https에서 http로 바꾼 다음 다시 시도)


④약관 동의후 finish 클릭


5. 이클립스 설정 및 SDK 업데이트 

- 이클립스를 실행하고 다운받은 안드로이드 SDK 경로를 선택한다. 그 후 SDK 업데이트를 한다. 용량이 대략 15G정도 되기 때문에 하드용량을 확인한 후 업데이트 한다.


이클립스를 실행한 후, 상단 메뉴에서 Window->Preference를 클릭하고 Android카테고리를 선택한 후, "SDK Location"에 다운받은 Android SDK 경로를 입력후 ok버튼 누른다

( 상단메뉴->Window->Preference->Android카테고리->SDK Location에 경로 입력 )

ex)C:\android_sdk


상단 메뉴 Window->"Android SDK and AVD Manager"를 클릭, "Installed Package" 카테고리를 선택한 후 "Update All"버튼을 선택한 후 필요한 패키지를 체크하고 "Install"버튼을 클릭한다

( 상단메뉴->Window->Android SDK and AVD Manager->Installed Package 카테고리->Update All->Install )

("Android SDK and AVD Manager"버튼이 분리되어 있는 경우도 기능은 같으니 그냥 하면 된다.)

Android SDK and AVD Manager



③가상 머신 설정(속도가 느리기 때문에 본인 안드로이드 폰으로 테스트하는게 빠르고 좋다.)

상단메뉴 Window->Android SDK and AVD Manager에서 "Virtual Device카테고리 선택하고 New클릭, Name에 적당한 이름 입력, Target에 애플리케이션이 구동될 안드로이드 OS를 선택, SD Card에는 적당한 용량 입력, Skin에는 AVD의 해상도를 선택

( 상단메뉴->Window->Android SDK and AVD Manager->Virtual Device->Newl->Name, Target, SD Card, Skin 입력 )





※핸드폰으로 테스트 할 경우 삼성 갤럭시의 경우 설정->개발자옵션->usb 디버깅을 체크한다.






Posted by -현's-

댓글을 달아 주세요