메뉴 건너뛰기

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

 

 

[ 회원테이블 - test_member ] 

필자는 mysql, php 과 교신하여 안드로이드 예제앱을 만들어 보았다.

 

 

 

[ AndroidManifest.xml ]

<uses-permission android:name="android.permission.INTERNET"/> 추가하자.

 

[ build.gradle ] (앱 수준)

1
2
3
4
dependencies {
.....
    implementation 'com.android.volley:volley:1.1.0'
}
cs

 

 

 

 

위의 사진을 보면 MainActivity 에서 최초 로그인과 회원가입 버튼이 처음에 나타나게 되고, 

로그인 화면 LoginActivity 와 로그인 POST 웹요청응답 처리를 하는 LoginRequest 클래스와 

회원가입 화면 RegisterActivity 와 회원가입 POST 웹요청응답 처리를 하는 RegisterRequest 클래스로 어우러지게 하였다.

 

[ activity_main.xml ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
 
    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_marginTop="20dp"
        android:text="회원가입 및 로그인 테스트"
        android:textSize="30dp"/>
 
    <FrameLayout
        android:id="@+id/frame1"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 
        <LinearLayout
            android:id="@+id/logoff_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="visible"
            android:orientation="vertical">
 
            <Button
                android:id="@+id/btn_login"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="로그인"
                android:textSize="20dp"/>
            <Button
                android:id="@+id/btn_register"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="회원가입"
                android:textSize="20dp"/>
        </LinearLayout>
 
        <LinearLayout
            android:id="@+id/logon_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="invisible"
            android:orientation="vertical">
 
            <TextView
                android:id="@+id/txt_login"
                android:layout_marginTop="20dp"
                android:textSize="20dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
            <Button
                android:id="@+id/btn_logout"
                android:text="로그아웃"
                android:textSize="20dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
        </LinearLayout>
 
    </FrameLayout>
</LinearLayout>
cs

위의 소스에서는 25라인, 46라인처럼 logoff_layout, logon_layout 으로 각각 로그인상태, 로그아웃상태에 따라서 구분되도록 구성하였다.

 

 

[ activity_register.xml ] - 회원가입 디자인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".RegisterActivity">
 
    <TextView
        android:id="@+id/textView3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="116dp"
        android:gravity="center"
        android:text="회원가입"
        android:textSize="40dp"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="0dp" />
 
    <EditText
        android:id="@+id/register_et_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:hint="아이디"
        app:layout_constraintTop_toBottomOf="@+id/textView3"
        tools:layout_editor_absoluteX="0dp" />
 
    <EditText
        android:id="@+id/register_et_pw"
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:hint="비밀번호"
        app:layout_constraintTop_toBottomOf="@+id/register_et_id"
        tools:layout_editor_absoluteX="0dp" />
 
    <EditText
        android:id="@+id/register_et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:hint="이름"
        app:layout_constraintTop_toBottomOf="@+id/register_et_pw"
        tools:layout_editor_absoluteX="0dp" />
 
    <EditText
        android:id="@+id/register_et_age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:inputType="number"
        android:hint="나이"
        app:layout_constraintTop_toBottomOf="@+id/register_et_name"
        tools:layout_editor_absoluteX="0dp" />
 
    <Button
        android:id="@+id/register_btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="Register"
        android:textSize="38dp"
        app:layout_constraintTop_toBottomOf="@+id/register_et_age"
        tools:layout_editor_absoluteX="-16dp" />
 
</androidx.constraintlayout.widget.ConstraintLayout>
cs

 

[ json_register_test_member.php ] - post방식으로 회원가입 응답결과처리용 php파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?
header("Content-Type:application/json");
include "../inc/config_noHeader.php";
 
$arr = array();
if ($_SERVER["REQUEST_METHOD"]=="POST") {
    
    $user_id    = trim($_POST[user_id]);
    $user_pw    = trim($_POST[user_pw]);
    $user_name    = trim($_POST[user_name]);
    $age        = trim($_POST[age]);
 
    $user_id    = addslashes($user_id);
    $user_pw    = addslashes($user_pw);
    $user_name    = addslashes($user_name);
    $user_age    = addslashes($user_age);
 
    $reg_date = time();
 
    $query = "insert into test_member (user_id,user_pw,user_name,age,reg_date) values ('$user_id','$user_pw','$user_name','$user_age','$reg_date')";
    if (mysql_query($query)) {
        $arr["success"= "1";
    } else {
        $arr["success"= "-1";
    }
 
else {
    $arr["success"= "error";
}
echo json_encode($arr,JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
?>
cs

 

 

[ RegisterRequest.java ]  - POST 방식으로 웹요청할 회원가입 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
 
import java.util.HashMap;
import java.util.Map;
 
public class RegisterRequest extends StringRequest {
 
    private final static String URL = "http://도메인주소/json/json_register_test_member.php";
    private Map<StringString> map;
 
    public RegisterRequest(String user_id, String user_pw, String user_name, int user_age, Response.Listener<String> listener, Response.ErrorListener errorListener) {
        super(Method.POST,URL, listener, errorListener);
 
        map = new HashMap<>();
        map.put("user_id",user_id);
        map.put("user_pw",user_pw);
        map.put("user_name",user_name);
        map.put("user_age",Integer.toString(user_age));
    }
 
    @Override
    protected Map<StringString> getParams() throws AuthFailureError {
        return map;
    }
}
 
cs

위 소스에서 24라인의 getParams() 가 POST 방식으로 보내질 매개변수들을 해시맵형태로 모아서 보내준다.

 

 

[ RegisterActivity.java ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;
 
import org.json.JSONException;
import org.json.JSONObject;
 
public class RegisterActivity extends AppCompatActivity {
 
    private EditText register_et_id,register_et_pw,register_et_name,register_et_age;
    private Button register_btn1;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
 
        register_et_id = findViewById(R.id.register_et_id);
        register_et_pw = findViewById(R.id.register_et_pw);
        register_et_name = findViewById(R.id.register_et_name);
        register_et_age = findViewById(R.id.register_et_age);
        register_btn1 = findViewById(R.id.register_btn1);
 
        register_btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                register();
            }
        });
    }
 
    private void register() {
        String user_id = register_et_id.getText().toString();
        String user_pw = register_et_pw.getText().toString();
        String user_name = register_et_name.getText().toString();
        int user_age = Integer.parseInt(register_et_age.getText().toString());
 
        Response.Listener<String> resposneListener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    String success = jsonObject.getString("success");
                    if (success != null && success.equals("1")) {  // 회원가입 완료
                        Toast.makeText(getApplicationContext(),"회원가입 성공!",Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(RegisterActivity.this,LoginActivity.class);
                        startActivity(intent);
                        finish();
                    } else {
                        Toast.makeText(getApplicationContext(),"회원가입 실패!",Toast.LENGTH_SHORT).show();
                        return;
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        };
 
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),"회원가입 처리시 에러발생!",Toast.LENGTH_SHORT).show();
                return;
            }
        };
 
        // Volley 로 회원양식 웹으로 전송
        RegisterRequest registerRequest = new RegisterRequest(user_id,user_pw,user_name,user_age,resposneListener,errorListener);
        registerRequest.setShouldCache(false);
 
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        queue.add(registerRequest);
    }
}
cs

51라인부터 보면 응답성공시에 나오는 부분이다.

json_register_test_member.php 에 회원가입관련 정보를 POST방식으로 보내면 그 응답결과를

{"success":"1"} 이나 {"success":"error"} 등의 json 결과물을 받을수 있다.

이 값을 JSONObject의 객체형태로 변환시켜 받아 볼수 있다. 추가로 대괄호 형태의 json 결과물은 JSONArray 형태로 받으면 된다.

 

 

[ activity_login.xml ] - 로그인 디자인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginActivity">
 
    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="132dp"
        android:gravity="center"
        android:text="로그인"
        android:textSize="40dp"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="0dp" />
 
    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintTop_toBottomOf="@+id/textView2"
        tools:layout_editor_absoluteX="-16dp">
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="아이디 : "
            android:textSize="30dp" />
 
        <EditText
            android:id="@+id/login_et_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
 
    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="42dp"
        android:orientation="horizontal"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout"
        tools:layout_editor_absoluteX="0dp">
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="비밀번호 : "
            android:textSize="30dp" />
 
        <EditText
            android:id="@+id/login_et_pw"
            android:inputType="textPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
 
    <Button
        android:id="@+id/login_btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="52dp"
        android:text="Log in"
        android:textSize="28dp"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout2"
        tools:layout_editor_absoluteX="0dp" />
 
</androidx.constraintlayout.widget.ConstraintLayout>
cs

 

 

[ json_login_test_member.php ] - post방식으로 로그인 응답결과처리용 php파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?
header("Content-Type:application/json");
include "../inc/config_noHeader.php";
 
$arr = array();
if ($_SERVER["REQUEST_METHOD"]=="POST") {
    
    $user_id    = trim($_POST[user_id]);
    $user_pw    = trim($_POST[user_pw]);
 
    $user_id    = addslashes($user_id);
    $user_pw    = addslashes($user_pw);
 
    $query = "select user_id from test_member where user_id='$user_id' and user_pw='$user_pw'";
    $res   = mysql_query($query);
    $row   = mysql_fetch_array($res);
    if ($row[user_id]) {
        $arr["success"= "1";        // 로그인 성공
    } else {
        $arr["success"= "-1";        // 로그인 실패
    }
 
else {
    $arr["success"= "error";
}
echo json_encode($arr,JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
?>
cs

 

 

[ LoginRequest.java ] - POST 방식으로 웹요청할 로그인 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
 
import java.util.HashMap;
import java.util.Map;
 
public class LoginRequest extends StringRequest {
    private final static String URL = "http://도메인주소/json/json_login_test_member.php";
    private Map<String,String> map;
 
    public LoginRequest(String user_id, String user_pw, Response.Listener<String> listener, Response.ErrorListener errorListener) {
        super(Method.POST, URL, listener, errorListener);
 
        map = new HashMap<>();
        map.put("user_id",user_id);
        map.put("user_pw",user_pw);
 
    }
 
    @Override
    protected Map<StringString> getParams() throws AuthFailureError {
        return map;
    }
}
cs

 

 

 

[ LoginActivity.java ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;
 
import org.json.JSONException;
import org.json.JSONObject;
 
public class LoginActivity extends AppCompatActivity {
    private EditText login_et_id,login_et_pw;
    private Button login_btn1;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        setTitle("로그인");
 
        login_et_id = findViewById(R.id.login_et_id);
        login_et_pw = findViewById(R.id.login_et_pw);
        login_btn1 = findViewById(R.id.login_btn1);
 
        login_btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                login();
            }
        });
    }
 
    private void login() {
        final String user_id = login_et_id.getText().toString();
        String user_pw = login_et_pw.getText().toString();
 
        Response.Listener<String> responseListener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
 
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    String success = jsonObject.getString("success");
                    if (success != null && success.equals("1")) {
                        Toast.makeText(getApplicationContext(),"로그인 성공!",Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(LoginActivity.this,MainActivity.class);
                        intent.putExtra("user_id",user_id);
                        startActivity(intent);
                        finish();
 
                    } else {
                        Toast.makeText(getApplicationContext(),"로그인 실패!",Toast.LENGTH_SHORT).show();
                        return;
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        };
 
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),"로그인 처리시 에러발생!",Toast.LENGTH_SHORT).show();
                return;
            }
        };
 
        // Volley 로 로그인 양식 웹전송
        LoginRequest loginRequest = new LoginRequest(user_id,user_pw,responseListener,errorListener);
        loginRequest.setShouldCache(false);
 
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        queue.add(loginRequest);
 
    }
}
cs

 

 

[ MainActivity.java ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
    LinearLayout logoff_layout, logon_layout;
    Button btn_login, btn_register, btn_logout;
    TextView txt_login;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("로그인,회원가입 테스트");
 
        logoff_layout = findViewById(R.id.logoff_layout);
        logon_layout = findViewById(R.id.logon_layout);
 
        btn_login = findViewById(R.id.btn_login);
        btn_logout = findViewById(R.id.btn_logout);
        btn_register = findViewById(R.id.btn_register);
        txt_login = findViewById(R.id.txt_login);
 
        Intent intent = getIntent();
        String user_id = intent.getStringExtra("user_id");
        if (user_id==null) {    // 로그아웃 상태
            logon_layout.setVisibility(View.INVISIBLE);
            logoff_layout.setVisibility(View.VISIBLE);
 
        } else {                // 로그인 상태
            logon_layout.setVisibility(View.VISIBLE);
            logoff_layout.setVisibility(View.INVISIBLE);
 
            txt_login.setText(user_id + " 회원님");
        }
 
 
        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                login();
            }
        });
 
        btn_logout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                logout();
            }
        });
 
        btn_register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                register();
            }
        });
    }
 
    private void login() {
        Intent intent = new Intent(MainActivity.this,LoginActivity.class);
        startActivity(intent);
    }
 
    private void logout() {
        new AlertDialog.Builder(this)
                .setTitle("로그아웃").setMessage("로그아웃 하시겠습니까?")
                .setPositiveButton("로그아웃"new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 로그아웃 처리
                        txt_login.setText("");
                        logon_layout.setVisibility(View.INVISIBLE);
                        logoff_layout.setVisibility(View.VISIBLE);
 
                        Intent intent = new Intent(MainActivity.this,LoginActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
                        startActivity(intent);
                    }
                })
                .setNegativeButton("취소"null)
                .show();
    }
 
    private void register() {
        Intent intent = new Intent(MainActivity.this,RegisterActivity.class);
        startActivity(intent);
    }
 
}
cs

 


  1. WebView를 사용할때 HttpClient를 이용한 Session 유지

    Date2018.12.27 Views4381
    Read More
  2. WebView 줌 컨트롤러 가리기

    Date2014.08.28 Views6316
    Read More
  3. WebView 작업할때 Net::ERR_UNKNOWN_URL_SCHEME 에러 발생할때 (전화걸기,문자보내기 안된다)

    Date2020.12.14 Views1069
    Read More
  4. Volley 이용시에 한글 깨질때 UTF-8로 변경

    Date2020.12.14 Views348
    Read More
  5. Volley 로 웹요청하고 응답받기3 - Get방식 , json 읽기 (php,mysql)

    Date2020.12.14 Views378
    Read More
  6. Volley 로 웹요청하고 응답받기2 - Post방식 , 로그인-회원가입 (php,mysql 연동)

    Date2020.12.14 Views1435
    Read More
  7. Volley 로 웹요청하고 응답받기1 - Get방식

    Date2020.12.14 Views348
    Read More
  8. Virtual Device , 디자인 화면

    Date2021.03.31 Views260
    Read More
  9. ViewFlipper 사용하기

    Date2015.07.16 Views9631
    Read More
  10. URL을 이용해서 이미지 다운로드 하기 (멀티 쓰레드 이용)

    Date2015.07.16 Views8992
    Read More
  11. URL을 이용해서 이미지 다운로드 하기

    Date2015.07.16 Views7407
    Read More
  12. This Handler class should be static or leaks might occur 시 해결법

    Date2020.12.14 Views240
    Read More
  13. TextureView를 이용한 카메라 Preview 좌우 반전

    Date2015.06.10 Views14235
    Read More
  14. setContentView()와 레이아웃 전개자(LayoutInflater)

    Date2021.03.31 Views266
    Read More
  15. ScrollView의 활용

    Date2015.07.16 Views6530
    Read More
  16. prepend(),append(),before(),after() 메서드

    Date2014.10.20 Views7361
    Read More
  17. MediaPlayer 클래스 사용법

    Date2018.10.02 Views1803
    Read More
  18. manifest 의 launchMode 속성

    Date2015.08.11 Views7576
    Read More
  19. ListView 사용시 특정 뷰로 생성 ( 그림 + 텍스트 )

    Date2015.07.16 Views7478
    Read More
  20. ListView 리스트뷰 연습3 - 커스텀 리스트뷰 (Custom ListView)

    Date2020.12.14 Views906
    Read More
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 Next
/ 13

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved