●소켓

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

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



●예제


서버

- 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-

댓글을 달아 주세요


●어싱크태스트(Async Task)

네트워크 연결이므로, 연결시에 지연이 발생할 수 있다. 따라서 메인쓰레드(UI쓰레드)로 네트워크 접속을 시도하면 앱은 접속이 성공되고 응답을 받을때까지 동작을 못하게 된다. 따라서 안드로이드 최근버전부터는 메인쓰레드가 네트워크 접속을 시도하는것 자체를 금지한다.


웹서버로부터 데이터를 가져와서 ListView 등에 출력하려면 동생쓰레드에서 가져온 데이터를 UI에 반영하는 작업이 필요한데, 안드로이드에서는 개발자가 정의한 쓰레드는 UI를 제어할 수 없도록 금지시켜놓았다. 그래서 Handler를 사용해야 하는데 이 작업은 번거롭다.

그래서 AsyncTask라는 백그라운드 작업용 클래스를 지원하게 되었다.


- AsyncTask = Thread + Handler




●로딩중 표시(ProgressDialog)

AsyncTask클래스 안에서 onPreExecute()안에 로딩중 표시 다이얼로그를 보여주고 onPostExecute()에 로딩중 표시 다이얼로그를 제거해준다.






●웹서버 연결 통신(HttpURLConnection)

- 접속대상 서버주소를 URL클래스와 통신을 담당하는 HttpURLConnection클래스를 이용해서 웹서버에 데이터를 넘겨주고 받는다.


- Manifest.xml에 '<uses-permission android:name="android.permission.INTERNET"/>, <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>'을 추가한다.




●예제


 - WebConnectActivity.java

package com.example.day0425;


import android.app.Activity;

import android.content.Context;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ListView;

import android.widget.Toast;


public class WebConnectActivity extends Activity implements OnClickListener{

Button btn;

MyAsyncTask task;

ListView listView;

MyListAapter adapter;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.webconnect);

listView = (ListView)findViewById(R.id.listView);

adapter = new MyListAapter(this);

listView.setAdapter(adapter);

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

btn.setOnClickListener(this);

}

//웹에서 데이터를 가져오기 전에 먼저 네트워크 상태부터 확인

public void conntectCheck(){

   ConnectivityManager connMgr = (ConnectivityManager) 

       getSystemService(Context.CONNECTIVITY_SERVICE);

   NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

   if (networkInfo != null && networkInfo.isConnected()) {

       // fetch data

    //Toast.makeText(this,"네트워크 연결중입니다.", Toast.LENGTH_SHORT).show();

    task = new MyAsyncTask(this);

task.execute("");

   } else {

       // display error

    Toast.makeText(this,"네트워크 상태를 확인하십시오", Toast.LENGTH_SHORT).show();

   }

}

public void onClick(View v) {

conntectCheck();

}

}

 



- webconnect.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"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="웹 연동 클릭"

        android:layout_gravity="center_horizontal"

        android:layout_marginTop="10dp"/>

    

    <ListView 

        android:id="@+id/listView"

        android:layout_width="match_parent"

        android:layout_height="match_parent">

    </ListView>

</LinearLayout>

 



- MyAsyncTask.java

package com.example.day0425;


import java.util.ArrayList;


import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


import android.app.ProgressDialog;

import android.content.Context;

import android.os.AsyncTask;

import android.widget.Toast;


/*

 * Params - 비동기 작업시 필요한 데이터 자료형

 * ex)웹사이트에 데이터 요청시 전송할 파라미터값(ID,PW 등....)

 * 

 * Progress - 비동기 방식의 요청이 진행될때 사용될 데이터 자료형.

 *  숫자형 자료형을 많이 사용한다.

 * 

 * Result - 웹서버로부터 가져오게 될 데이터에 알맞는 자료형을 개발자가 결정

 * 주로 JSON, XML등을 가져오게 되므로 String을 많이 사용한다.

 */

public class MyAsyncTask extends AsyncTask<String, Integer, String>{

WebConnectActivity context;

ProgressDialog dialog;

LoadManager load;//접속과 요청을 담당하는 객체 선언

public MyAsyncTask(Context context) {

this.context = (WebConnectActivity)context;

load = new LoadManager();

}

//백그라운드 작업 수행전에 해야할 업무등을 이 메서드에 작성하며 되는데,

//이 메서드는 UI쓰레드에 의해 작동하므로 UI를 제어할 수 있다.

//따라서 이 타이밍에 진행바를 보여주는 작업등을 할 수 있다.

protected void onPreExecute() {

super.onPreExecute();

dialog = new ProgressDialog(context);

//dialog.setCancelable(false);

dialog.show();

}

//비동기방식으로 작동할 메서드이며, 주로 메인쓰레드와는 별도로

//웹사이트의 연동이나 지연이 발생하는 용도로 사용하면 된다.

//사실상 개발자가 정의 쓰레드에서 run메서드와 비슷하다

//  'String...' 가변형 파라미터로 파라미터 개수 상관없이 넣을 수 있다.

protected String doInBackground(String... params) {

//웹서버에 요청시도

String data = load.request();

return data;

}

//백그라운드 메서드가 업무수행을 마칠때 호출되는 메서드.

//UI쓰레드에 의해 호출되므로, UI쓰레드를 제어할 수 있다.

//따라서 진행바를 그만 나오게 할 수 있다.

protected void onPostExecute(String result) {

super.onPostExecute(result);

dialog.dismiss();

Toast.makeText(context, result, Toast.LENGTH_SHORT).show();

System.out.println("a");

//최종적으로 웹서버로부터 데이터를 완전히 가져온 시점은 이 메서드이므로,

//어댑터가 보유한 ArrayList를 갱신시켜주자!

ArrayList<DataVo> dataList = context.adapter.lst;

dataList.removeAll(dataList);

try {

JSONObject o = new JSONObject(result);

//JSONArray array = new JSONArray(result);

JSONArray array = o.getJSONArray("a");

DataVo dataVo = null;

JSONObject obj = null;

System.out.println("1");

for(int i=0;i<array.length();i++){

obj = array.getJSONObject(i);

dataVo = new DataVo();


System.out.println("2obj.getString(name):"+obj.getString("name"));

dataVo.setName(obj.getString("name"));

dataVo.setAge(obj.getInt("age"));

dataVo.setIsBool(obj.getString("isBool"));

dataList.add(dataVo);


context.listView.invalidateViews();

}

System.out.println("3");

context.listView.invalidate();

System.out.println("array.length():"+array.length());

} catch (JSONException e) {

e.printStackTrace();

}

}

}





- LoadManager.java

package com.example.day0425;


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;


public class LoadManager {

URL url; //접속대상 서버주소를 가진 객체

HttpURLConnection conn; //통신을 담당하는 객체

BufferedReader buffer=null;


//필요한 객체 초기화

public LoadManager() {

try {

url = new URL("http://192.168.0.18:8080/index2.jsp");

conn = (HttpURLConnection)url.openConnection();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public String request(){

String data="";

try {

conn.connect(); //웹서버에 요청하는 시점

InputStream is = conn.getInputStream(); //웹서버로부터 전송받을 데이터에 대한 스트림 얻기

//1byte기반의 바이트스트림이므로 한글이 깨진다.

//따라서 버퍼처리된 문자기반의 스트림으로 업그레이드 해야 된다.

buffer = new BufferedReader(new InputStreamReader(is));

//스트림을 얻어왔으므로, 문자열로 반환

StringBuffer str = new StringBuffer();

String d=null;

while( (d=buffer.readLine()) != null){

str.append(d);

}

data = str.toString();

} catch (IOException e) {

e.printStackTrace();

} finally{

if(buffer!=null){

try {

buffer.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

return data;

}

}

 



- MyListAdapter.java

package com.example.day0425;


import java.util.ArrayList;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.TextView;


public class MyListAapter extends BaseAdapter{

ArrayList<DataVo> lst = new ArrayList<DataVo>();

Context context;

LayoutInflater infalter;

public MyListAapter(Context context) {

this.context = context;

infalter = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

}

public int getCount() {

return lst.size();

}

public Object getItem(int arg0) {

return null;

}

public long getItemId(int arg0) {

return 0;

}

public View getView(int position, View convertView, ViewGroup parent) {

View view = null;

if(convertView==null){

view = infalter.inflate(R.layout.list_item, parent, false);

}else{

view = convertView;

}

TextView txt_name = (TextView)view.findViewById(R.id.txt_name);

TextView txt_age = (TextView)view.findViewById(R.id.txt_age);

TextView txt_bool = (TextView)view.findViewById(R.id.txt_bool);

DataVo dataVo = (DataVo)lst.get(position);

txt_name.setText(dataVo.getName());

txt_age.setText(Integer.toString(dataVo.getAge()));

txt_bool.setText(dataVo.getIsBool());

return view;

}

}

 



- list_item.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="horizontal" >

    

    <ImageView 

        android:id="@+id/imgView"

        android:layout_width="0dp"

        android:layout_height="45dp"

        android:layout_weight="1"

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

    <TextView 

        android:id="@+id/txt_name"

        android:layout_width="0dp"

        android:layout_height="45dp"

        android:layout_weight="1"

        android:text="이름"

        android:textSize="20dp"

        android:gravity="center"/>

    <TextView 

        android:id="@+id/txt_age"

        android:layout_width="0dp"

        android:layout_height="45dp"

        android:layout_weight="1"

        android:text="22"

        android:textSize="20dp"

        android:gravity="center"/>

    <TextView 

        android:id="@+id/txt_bool"

        android:layout_width="0dp"

        android:layout_height="45dp"

        android:layout_weight="1"

        android:text="true"

        android:textSize="20dp"

        android:gravity="center"/>

    

</LinearLayout>




- DataVo.java

package com.example.day0425;


public class DataVo {

private String img;

private String name;

private int age;

private String isBool;

public String getImg() {

return img;

}

public void setImg(String img) {

this.img = img;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getIsBool() {

return isBool;

}

public void setIsBool(String isBool) {

this.isBool = isBool;

}

}

 



- Manifest.xml

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

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

    package="com.example.day0425"

    android:versionCode="1"

    android:versionName="1.0" >


    <uses-sdk

        android:minSdkVersion="11"

        android:targetSdkVersion="21" />

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

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


    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        

        <activity android:name="com.example.day0425.WebConnectActivity">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />


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

            </intent-filter>

        </activity>

    </application>


</manifest>

 



- http://192.168.0.18:8080/index2.jsp

 {a:[{name:"토끼1",age:22,isBool:true},{name:"토끼2",age:25,isBool:true},{name:"토끼3",age:27,isBool:true}]}













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-

댓글을 달아 주세요


●ViewPager와 SQLite를 이용한 예제


- MainActivity.java

package com.example.example1;


import java.util.ArrayList;


import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.support.v4.view.ViewPager;

import android.support.v4.view.ViewPager.OnPageChangeListener;

import android.support.v7.app.ActionBarActivity;


public class MainActivity extends ActionBarActivity implements OnPageChangeListener{

SQLiteDatabase db;

ViewPager viewPager;

MyViewPagerAdapter adapter;

ResultFragment resultFragment;

ArrayList memLst = new ArrayList();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

viewPager = (ViewPager)findViewById(R.id.viewPager);

adapter = new MyViewPagerAdapter(getSupportFragmentManager());

viewPager.setAdapter(adapter);

viewPager.setOnPageChangeListener(this);

adapter.getItem(1);

MyOpenHelper helper = new MyOpenHelper(getApplicationContext());

db = helper.getWritableDatabase();

resultFragment = (ResultFragment)adapter.getItem(1);

}

//페이지 전환 메서드를 정의(프레그먼트들이 사용한다)

public void setPage(int position){

viewPager.setCurrentItem(position);

}


public void onPageScrollStateChanged(int arg0) {

System.out.println("onPageScrollStateChanged arg0:"+arg0);


}


public void onPageScrolled(int arg0, float arg1, int arg2) {


System.out.println("onPageScrolled");

}

//회원가입 정보 확인

public MemberVo getDetail(){

MemberVo memberVo=null;

StringBuffer sqlQry = new StringBuffer();

sqlQry.append("select idx, id, pw, name from member ");

sqlQry.append("where idx = (select max(idx) from member); ");

Cursor rs = db.rawQuery(sqlQry.toString(), null);

System.out.println("getdetail");

if(rs.moveToNext()){

memberVo = new MemberVo();

memberVo.setIdx(rs.getInt(0));

memberVo.setId(rs.getString(1));

memberVo.setPw(rs.getString(2));

memberVo.setName(rs.getString(3));

System.out.println("aaa:"+rs.getInt(0)+rs.getInt(1)+rs.getInt(2)+rs.getInt(3));

}

return memberVo;

}

//두번째 페이지에 데이터를 주입

public void dataSend(){

MemberVo memberVo = getDetail();

if(adapter.getItem(1)==null){

System.out.println("null입니다");

}

String txt = "id:"+memberVo.getId()+" 비번:"+memberVo.getPw()+" 이름:"+memberVo.getName();


resultFragment.textView.setText(txt);

}

//페이지 스크롤의 확정, 즉 선택한 페이지가 확정될때 호출되는 메시지

public void onPageSelected(int arg0) {

System.out.println("onPageSelected arg0:"+arg0);

switch(arg0){

case 0:

break;

case 1:

dataSend();

break;

}

}

}

 



- activity_main.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}" >

  <com.example.example1.MyViewPager  

     android:id="@+id/viewPager"

   android:layout_width="match_parent"

   android:layout_height="match_parent">

  </com.example.example1.MyViewPager>

</RelativeLayout>




- MyViewPager.java

package com.example.example1;


import android.content.Context;

import android.support.v4.view.ViewPager;

import android.util.AttributeSet;

import android.view.MotionEvent;


public class MyViewPager extends ViewPager{


public MyViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

}


//뷰페이저의 스와이핑(swipe) 막기

public boolean onTouchEvent(MotionEvent arg0) {

return false;

}

public boolean onInterceptTouchEvent(MotionEvent arg0) {

return false;

}

}




- MyViewPagerAdapter

package com.example.example1;


import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentStatePagerAdapter;


public class MyViewPagerAdapter extends FragmentStatePagerAdapter{

Fragment[] fragments =  new Fragment[2];

public MyViewPagerAdapter(FragmentManager fm) {

super(fm);

fragments[0] = new JoinFragment();

fragments[1] = new ResultFragment();

}


public Fragment getItem(int arg0) {

return fragments[arg0];

}


public int getCount() {

return fragments.length;

}


}




- JoinFragment.java

package com.example.example1;


import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;


public class JoinFragment extends Fragment implements OnClickListener{


EditText edit_id;

EditText edit_pw;

EditText edit_name;

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

//버튼들과 리스너와의 연결

View view = inflater.inflate(R.layout.join_fragment, container, false);


Button btn_join = (Button)view.findViewById(R.id.btn_join);


edit_id = (EditText)view.findViewById(R.id.edit_id);

edit_pw = (EditText)view.findViewById(R.id.edit_pw);

edit_name = (EditText)view.findViewById(R.id.edit_name);

btn_join.setOnClickListener(this);

return view;

}

//DB에 한건 입력하는 메서드

public void insert(String id, String pw, String name){

StringBuffer sqlQry = new StringBuffer();

sqlQry.append("insert into member (id, pw,name) ");

sqlQry.append(" values('"+id+"','"+pw+"', '"+name+"');");

MainActivity mainActivity = (MainActivity)getActivity();

SQLiteDatabase db = mainActivity.db;

db.execSQL(sqlQry.toString());

//수행 성공하면 화면전환하기

System.out.println("insert 성공");

//결과페이지로 전환

mainActivity.setPage(1);

}

public void valueCheck(){

//무결성 데이터를 넣기 위해 데이터 검사후 insert()호출

String msg=null;

if(edit_id.getText().toString().trim().equals("")||edit_id.getText().toString().trim().length()==0){

msg="아이디를 입력하세요";

Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();

return;

}

if(edit_pw.getText().toString().trim().equals("")||edit_pw.getText().toString().trim().length()==0){

msg="패스워드를 입력하세요";

Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();

return;

}

if(edit_name.getText().toString().trim().equals("")||edit_name.getText().toString().trim().length()==0){

msg="이름을 입력하세요";

Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();

return;

}

Toast.makeText(getActivity(), "가입하기", Toast.LENGTH_SHORT).show();

insert(edit_id.getText().toString(), edit_pw.getText().toString(), edit_name.getText().toString());

}

public void onClick(View v) {

switch(v.getId()){

case R.id.btn_join:

valueCheck();

break;

default:

break;

}

}

} 



- join_fragment.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" >

    <TextView 

        android:id="@+id/txt_title"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="회원가입"

        android:textSize="25dp"

        android:gravity="center_horizontal"

        android:layout_marginTop="30dp"/>

    

    

    <LinearLayout 

        android:id="@+id/layout_id"

        android:orientation="horizontal"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@id/txt_title">

        

   <TextView 

       android:id="@+id/txt_id"

       android:layout_width="100dp"

       android:layout_height="wrap_content"

       android:text="ID"

       android:textSize="20dp"

       android:layout_marginLeft="30dp"

       android:layout_marginTop="50dp"/>

   <EditText 

       android:id="@+id/edit_id"

       android:layout_width="150dp"

       android:inputType="textVisiblePassword"

       android:layout_height="wrap_content"

       android:layout_marginTop="50dp"/>

    </LinearLayout>

    

    <LinearLayout 

        android:id="@+id/layout_pw"

        android:orientation="horizontal"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@id/layout_id">

        

    <TextView 

       android:id="@+id/txt_pw"

       android:layout_width="100dp"

       android:layout_height="wrap_content"

       android:text="PW"

       android:textSize="20dp"

       android:layout_marginLeft="30dp"

       android:layout_marginTop="20dp"/>

    <EditText 

       android:id="@+id/edit_pw"

       android:password="true"

       android:layout_width="150dp"

       android:inputType="textVisiblePassword"

       android:layout_height="wrap_content"

       android:layout_marginTop="20dp"/>

     

    </LinearLayout>

    

    <LinearLayout 

        android:id="@+id/layout_name"

        android:orientation="horizontal"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@id/layout_pw">

          <TextView 

       android:id="@+id/txt_name"

       android:layout_width="100dp"

       android:layout_height="wrap_content"

       android:text="이름"

       android:textSize="20dp"

       android:layout_marginLeft="30dp"

       android:layout_marginTop="20dp"/>

    <EditText 

       android:id="@+id/edit_name"

       android:layout_width="150dp"

       android:inputType="text"

       android:layout_height="wrap_content"

       android:layout_marginTop="20dp"/>

        

    </LinearLayout>

    

   <LinearLayout 

        android:id="@+id/layout_btn"

        android:orientation="horizontal"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@id/layout_name"

        android:layout_marginTop="30dp"

        android:gravity="center_horizontal">

    <Button 

        android:id="@+id/btn_join"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="가입하기"

        android:layout_marginRight="20dp"/>

     </LinearLayout>     

</RelativeLayout>

 



- ResultFragment.xml

package com.example.example1;


import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.Button;

import android.widget.TextView;


public class ResultFragment extends Fragment implements OnClickListener{

TextView textView;

MainActivity mainActivity;

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {


mainActivity = (MainActivity)getActivity();

View view = inflater.inflate(R.layout.result_fragment, container, false);

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

Button btn_prv = (Button)view.findViewById(R.id.btn_prv);


btn_prv.setOnClickListener(this);

return view;

}


@Override

public void onClick(View v) {

switch(v.getId()){

case R.id.btn_prv:

mainActivity.setPage(0);

break;

}

}

}

 



- result_fragment.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"

    android:background="#2F9D27"

    android:gravity="center" >

    

    <TextView 

        android:id="@+id/textView"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="회원정보"

        android:textSize="20dp"/>

    

    <Button 

        android:id="@+id/btn_prv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="돌아가기"/>

</LinearLayout>

 



- MemberVo.java

package com.example.example1;


public class MemberVo {

private int idx;

private String id="";

private String pw="";

private String name="";

public int getIdx() {

return idx;

}

public void setIdx(int idx) {

this.idx = idx;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getPw() {

return pw;

}

public void setPw(String pw) {

this.pw = pw;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

 


- MyOpenHelper.java

package com.example.example1;


import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.widget.Toast;


public class MyOpenHelper extends SQLiteOpenHelper{

Context context;

public MyOpenHelper(Context context) {

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

this.context = context;

}

public void onCreate(SQLiteDatabase db) {

//표준sql

//String형은 immutable 수정불가능한 객체다.

//따라서 String형을 계속 누적해나가면 변경되는 것이 아니라

//새롭게 생성된다. 문제점 해결을 우해 수정가능한 문자열 처리 개체를 사용한다.

StringBuffer sqlQry = new StringBuffer();

sqlQry.append("create table member(");

sqlQry.append("idx integer primary key autoincrement,");

sqlQry.append("id varchar(20),");

sqlQry.append("pw varchar(20),");

sqlQry.append("name varchar(20)");

sqlQry.append(");");

db.execSQL(sqlQry.toString());

System.out.println("데이터베이스 생성 성공");

Toast.makeText(context, "데이터베이스 생성 성공", Toast.LENGTH_LONG);

}

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

}

}

 

























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-

댓글을 달아 주세요


●뷰페이저(ViewPager)

- 화면을 좌우로 드래그해서 화면을 전환하는 기법이다.


- import android.support.v4.app.~~ 를 선언해야한다.





●예제

- 버튼을 클릭하거나 좌우로 드래그하면 화면이 전환되고 2초마다 화면이 자동으로 전환되는 예제


MainActivity.java

package com.example.day0404;


import android.os.Bundle;

import android.os.Handler;

import android.support.v4.view.ViewPager;

import android.support.v7.app.ActionBarActivity;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;


public class MainActivity extends ActionBarActivity implements OnClickListener{

Button btn[] = new Button[3];

ViewPager viewPager = null;

Thread thread = null;

Handler handler = null;

int p=0; //페이지번호

int v=1; //화면 전환 뱡향

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//viewPager

viewPager = (ViewPager)findViewById(R.id.viewPager);

MyViewPagerAdapter adapter = new MyViewPagerAdapter(getSupportFragmentManager());

viewPager.setAdapter(adapter);


btn[0] = (Button)findViewById(R.id.btn_a);

btn[1] = (Button)findViewById(R.id.btn_b);

btn[2] = (Button)findViewById(R.id.btn_c);


for(int i=0;i<btn.length; i++){

btn[i].setOnClickListener(this);

}

handler = new Handler(){


public void handleMessage(android.os.Message msg) {

if(p==0){

viewPager.setCurrentItem(1);

p++;

v=1;

}if(p==1&&v==0){

viewPager.setCurrentItem(1);

p--;

}if(p==1&&v==1){

viewPager.setCurrentItem(2);

p++;

}if(p==2){

viewPager.setCurrentItem(1);

p--;

v=0;

}

}

};

thread = new Thread(){

//run은 jvm이 쓰레드를 채택하면, 해당 쓰레드의 run메서드를 수행한다.

public void run() {

super.run();

while(true){

try {

Thread.sleep(2000);

handler.sendEmptyMessage(0);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

};

thread.start();

}


@Override

public void onClick(View v) {

switch(v.getId()){

case R.id.btn_a:

viewPager.setCurrentItem(0);

Toast.makeText(this,"A버튼", Toast.LENGTH_SHORT).show();

break;

case R.id.btn_b:

viewPager.setCurrentItem(1);

Toast.makeText(this,"B버튼", Toast.LENGTH_SHORT).show();

break;

case R.id.btn_c:

viewPager.setCurrentItem(2);

Toast.makeText(this,"C버튼", Toast.LENGTH_SHORT).show();

break;

default:

break;

}

}

}




- 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}" >

    

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

        <Button 

            android:id="@+id/btn_a"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="A"

            style="@style/Widget.AppCompat.ActionButton"/>

        <Button 

            android:id="@+id/btn_b"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="B"

            style="@style/Widget.AppCompat.ActionButton"/>

        <Button 

            android:id="@+id/btn_c"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="C"

            style="@style/Widget.AppCompat.ActionButton"/>

                

    </LinearLayout>

    

    <android.support.v4.view.ViewPager

        android:id="@+id/viewPager"

        android:layout_width="match_parent"

        android:layout_height="match_parent"/>

    


</LinearLayout>




- MyViewPagerAdapter.java

package com.example.day0404;


import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentStatePagerAdapter;


public class MyViewPagerAdapter extends FragmentStatePagerAdapter{

/*

* 이 클래스의 부모생성자 호출시 인수로 반드시 FragmentManager객체를 넘겨야한다.

* 이 객체는 Activity에서만 만들수 있고, 여기서사용중인 Fragment가 v4이기 때문에

* Activity중에서도 ActionBarActivity에서 얻어와야한다.

*/

Fragment[] fragments = new Fragment[3];

public MyViewPagerAdapter(FragmentManager fm) {

super(fm);

fragments[0] = new FragmentA();

fragments[1] = new FragmentB();

fragments[2] = new FragmentC();

}

//아래의 메서드들의 호출 주체는 ViewPager이다.

//ListView와 원리가 같다.

/*

* 여러 프레그먼트 중 어떤 프레그먼트를 보여줄지 결정

*/

public Fragment getItem(int arg0) {

return fragments[arg0];

}

/*

* 보여질 프레그먼트가 몇개인지 결정

*/

public int getCount() {

return fragments.length;

}

}




- FragmentA.java

package com.example.day0404;


import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;



public class FragmentA extends Fragment{

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment_a, container, false);

}

}

 



- fragment_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" 

    android:background="#3DB7CC">

</LinearLayout>

 



- FragmentB.java, fragment_b.xml, FragmentC.java, fragment_c.xml 동일
















Posted by -현's-

댓글을 달아 주세요


●액션바(Actionbat)

- 앱 상단에 나오는 네이게이션 모드를 제공해 주는 바이다. 유저의 위치를 확인시켜주고 메뉴등을 제공해 줘서 유저가 앱을 더 편리하게 사용하도록 한다.


안드로이드 버전 11부터는 Activity에 이미 액션바가 지원된다. 개발자가 매니페스트에 설정하지 않으면 나오지 않는것 뿐이었다. 이전 버전 개발시 반드시 ActionBarActivity클래스를 상속 받아야 한다.


- 액션바를 사용하려면 매니페스트에 테마(android:theme="@android:style/~~~)를 추가하면 된다.





●예제1


- ActionBarMain.java

package study.bar;


import com.example.day0328.R;


import android.app.Activity;

import android.os.Bundle;


public class ActionBarMain extends Activity{

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.actionbar_main);

}

}




- actionbat_main.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" >

    


</LinearLayout>




- manifest.xml

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

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

    package="com.example.day0328"

    android:versionCode="1"

    android:versionName="1.0" >


    <uses-sdk

        android:minSdkVersion="11"

        android:targetSdkVersion="21" />


    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_action_search"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="study.bar.ActionBarMain"

            android:theme="@android:style/Theme.Holo.Light"

            android:label="@string/title_activity_action_bar_test" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />


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

            </intent-filter>

        </activity>

    </application>


</manifest>















예제2


- 액티비티를 생성할대 Android Activity를 선택하고 Blank Activity를 선택한다.




- ActionBarTest.java

package study.bar;


import android.app.Fragment;

import android.app.FragmentManager;

import android.app.FragmentTransaction;

import android.os.Bundle;

import android.support.v7.app.ActionBarActivity;

import android.view.Menu;

import android.view.MenuItem;

import android.widget.Toast;


import com.example.day0328.R;


public class ActionBarTest extends ActionBarActivity {

FragmentManager manager;

FragmentTransaction trans;

//프레그먼트의 개수가 많을때는 배열을 사용하면 편하다

Fragment[] fragments = new Fragment[3];

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_action_bar_test);

//11버전 이후는 모든 Activity에 Fragment가 지원된다.

manager = this.getFragmentManager();

fragments[0] = (Fragment1)manager.findFragmentById(R.id.frg_1);

fragments[1] = new Fragment2();

fragments[2] = new Fragment3();

}

/*

* 개발자가 액션바에 메뉴를 추가하거나, 수정할려면 앞으로

* 이 메서드가 호출하고 있는 R.menu.~~.xml파일을 수정하면 된다.

*/

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.action_bar_test, menu);

return true;

}

/*

* 사용자가 아이템들을 선택하면, 이벤트가 발생하고

* 해당 아이템 정보가 아래의 메서드의 인수로 전달된다.

* MenuItem item 변수가 이벤트를 일으킨 아이템이다.

*/

public boolean onOptionsItemSelected(MenuItem item) {

int id = item.getItemId();

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

Toast.makeText(this, "클릭1", Toast.LENGTH_SHORT).show();

trans = manager.beginTransaction();

trans.replace(R.id.frg_1, fragments[0]);

trans.commit();

return true;

}

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

Toast.makeText(this, "클릭2", Toast.LENGTH_SHORT).show();

trans = manager.beginTransaction();

trans.replace(R.id.frg_1, fragments[1]);

trans.commit();

return true;

}

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

Toast.makeText(this, "클릭3", Toast.LENGTH_SHORT).show();

trans = manager.beginTransaction();

trans.replace(R.id.frg_1, fragments[2]);

trans.commit();

return true;

}

return super.onOptionsItemSelected(item);

}

}



- activity_action_bar_test.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"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:con="" >


    <fragment

        android:id="@+id/frg_1"

        android:name="study.bar.Fragment1"

        android:layout_width="match_parent"

        android:layout_height="match_parent"/>


</LinearLayout>

 



- res/menu/action_bar_test.xml

<menu 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"

    tools:context="com.example.day0328.ActionBarTest" >


    <item

        android:id="@+id/action_settings"

        android:orderInCategory="100"

        android:title="new"

        android:icon="@drawable/ic_action_new"

        app:showAsAction="always"/>

     <item

        android:id="@+id/action_settings2"

        android:orderInCategory="100"

        android:title="search"

        android:icon="@drawable/ic_action_search"

        app:showAsAction="always"/>

      <item

        android:id="@+id/action_settings3"

        android:orderInCategory="100"

        android:title="@string/action_settings"

        app:showAsAction="always"/>


</menu>




- Fragment1.java

package study.bar;


import com.example.day0328.R;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class Fragment1 extends Fragment{

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

//3번째 인수는 return한 결과를 시스템이 알아서 구성해주므로

//true로 하지 말고 false로 하면 된다.

return inflater.inflate(R.layout.fragment1, container, false);

}


}




- fragment1.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"

    android:background="#0100FF" >

    


</LinearLayout>

 



- Fragment2.java

package study.bar;


import com.example.day0328.R;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class Fragment2 extends Fragment{

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment2, container, false);

}


}




- fragment2.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"

    android:background="#660033" >

    


</LinearLayout>




- Fragment3.java

package study.bar;


import com.example.day0328.R;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class Fragment3 extends Fragment{

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment3, container, false);

}


}




- fragment3.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"

    android:background="#8C8C8C" >

    


</LinearLayout>















Posted by -현's-

댓글을 달아 주세요


●프래그먼트(Fragment)

- 스마트폰 화면이 커지고, 태블릿 피시의 등작으로 한 화면안에 여러 액티비티를 처리해야할 필요가 생겨났다. 그래서 하나의 액티비티안에 각각 여러개의 독립적으로 분할된 화면을 처리하기 위해 안드로이드 API 11(허니콤)부터 Fragment가 등장했다.


- Fragment를 상속받은 클래스를 만들고 FragmentManager, FragmentTransaction를 이용해서 화면 처리를 한다.







●예제

- 버튼A, B, C를 누르면 화면 변경되는 예제(지금은 잘 안쓰는 방법)


- FragmentTest.java

package study.fragment;


import android.app.Activity;

import android.app.FragmentManager;

import android.app.FragmentTransaction;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;


import com.example.day0328.R;


public class FragmentTest extends Activity{

FragmentManager manager;

FragmentTransaction trans;

FragmentA fa;

FragmentB fb = new FragmentB();

FragmentC fc = new FragmentC();

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.fragment_test);

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

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

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

//OnClickListener를 implements해서 사용할 수도 있지만

//내부클래스로 만들어서 사용할 수 있다.

//재사용성이 없는 클래스는 굳이 .java로 따로 빼서 만들 필요 없다.

//프래그먼트를 제어하기 위해서는 FragmentManager를 사용해야한다.

manager = getFragmentManager();

fa = (FragmentA)manager.findFragmentById(R.id.frg_a);

//프래그먼트를 실행중에 동적으로 넣고, 빼고, 대체하려면

//FragmentTransation을 사용해야한다.

btn_a.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

//fragment_a호출

trans = manager.beginTransaction();

trans.replace(R.id.frg_a, fa);

trans.commit();

}

});

btn_b.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

//fragment_b호출

trans = manager.beginTransaction();

trans.replace(R.id.frg_a, fb);

trans.commit();

}

});

btn_c.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

//fragment_c호출

trans = manager.beginTransaction();

trans.replace(R.id.frg_a, fc);

trans.commit();

}

});

}

}





- fragment_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" >

    

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal"

        android:gravity="center_horizontal">

        

        <Button 

            android:id="@+id/btn_a"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="화면A"/>

        <Button 

            android:id="@+id/btn_b"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="화면B"/>

        <Button 

            android:id="@+id/btn_c"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="화면C"/>

        

    </LinearLayout>

    <fragment

        android:name="study.fragment.FragmentA"

        android:id="@+id/frg_a"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_margin="10dp"/>

    

    

</LinearLayout>




- FragmentA.java

package study.fragment;


import com.example.day0328.R;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class FragmentA extends Fragment{

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

//개발자가 정의한 디자인 파일을 인플레이션 시킨후 반환된 뷰를 현재 메서드의 반환값으로 지정

View view = inflater.inflate(R.layout.fragment_a, container, false);

return view;

}

}




- fragment_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" 

    android:background="#ffdd00">

    

</LinearLayout>

 



- FragmentB.java

package study.fragment;


import com.example.day0328.R;

import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class FragmentB extends Fragment{

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_b, container, false);

return view;

}

}

 



- fragment_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"

    android:background="#ff2321" >

    


</LinearLayout>




- FragmentC.java

package study.fragment;


import com.example.day0328.R;


import android.app.Fragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


public class FragmentC extends Fragment{


public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_c, container, false);

return view;

}


}

 



- fragment_c.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"

    android:background="#22741C" >

    


</LinearLayout>












Posted by -현's-

댓글을 달아 주세요