setImageResource() 를 이용해서 들어가있는 이미지를 비우고 싶다면

null을 넣지말고


view.setImageResource(0);


이런식으로 0값을 넣어주면 된다

깃허브에서 HoloColorPicker(https://github.com/LarsWerkman/HoloColorPicker) 를 

적용시켜서 사용하던중 선택한 칼라 값을 가져와서 작업을 하려고 값을 확인하는데


값이 -124123 -124124 -124545 등   마이너스 값들이 막 나왔다


HEX값으로 변환 (FF0500 이런 값)을 하고 싶어서 찾아보니



String hexColor = String.format("#%06X", (0xFFFFFF & intColor));

이것을 적용하면 되겠다 싶었다.


///////////////////////////////////////////////


@Override
public void onColorChanged(int color) {
String hexColor = String.format("#%06X", (0xFFFFFF & color));

Log.d("testPrint", hexColor);
}


volley 기능을 추상클래스로 만들고 -> Request


그 추상클래스를 상속받아 파라미터와 추가URL을 설정하는 클래스를 만들고 ->TestRequest


그 클래스의 객체를 만들어 실행하는 ->TestActivity


구조를 만들고 싶어서 만들고있는데...

되긴되지만 아직 미완성이다... 더 공부해야겠다


/////////////////////////////////////////////////////////////////

파라미터를 겟방식으로 url에 붙이는 것을 추가하는 것과

response 결과 데이터를 가공하는 것에대해 더 수정해야할것같다

비동기에대한 공부를 더해봐야겠다


//////////////////////////////////////////////////////////////////


Request.java


import android.app.ProgressDialog;
import android.content.Context;
import android.util.Log;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.JsonRequest;

import org.json.JSONObject;

import java.util.HashMap;


public abstract class Request {
private HashMap<String, String> params = new HashMap<String, String>();
private ProgressDialog loadingDialog;

private Context context = null;
private String baseUrl = "http://11.22.33.44/hahaha/";
private String urlName;
private String resultString="";

public Request(Context context) {
this.context = context;
}

public void request(final VolleyCallback callback) {
RequestQueue queue = VolleyUtill.getInstance(context).getRequestQueue();
loadingDialog = ProgressDialog.show(context, "불러오는 중입니다..","Please wait..", true, false);

JsonObjectRequest jsObjRequest = new JsonObjectRequest(
JsonRequest.Method.GET, baseUrl+urlName, (String)null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i("Response", response.toString());

resultString = response.toString();
callback.onSuccess(resultString);
loadingDialog.dismiss();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Response_error", error.toString());
loadingDialog.dismiss();
}
}
);

// Get the ImageLoader through your singleton class.
//mImageLoader = VolleyUtill.getInstance(this).getImageLoader();

VolleyUtill.getInstance(context).addToRequestQueue(jsObjRequest);
}

public interface VolleyCallback{
void onSuccess(String result);
}

/*
public Response.Listener<JSONObject> createMyReqSuccessListener() {
return new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i("Response", response.toString());
//String stringFromJson = parseJSON(response);
result = response.toString();
//setResultString(response.toString());
loadingDialog.dismiss();
}
};
}

public Response.ErrorListener createMyReqErrorListener() {
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Response error","errorr!!!!!!!");
//result = "fail";
//setResultString(error.toString());
loadingDialog.dismiss();
}
};
}*/

public void clearParams() {
this.params = new HashMap<String, String>();
}

public void setParam(String key, String value) {
this.params.put(key, value);
}

public void setUrlName(String urlName) {
this.urlName = urlName;
}

}


TestRequest.java


import android.content.Context;
import android.util.Log;

//import com.~~~~~~~~~~~~~.Request;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.HashMap;


public class TestRequest extends Request {
private String result;

public TestRequest (Context context) {
super(context);
}

public void setParams(String userId) {
super.clearParams();
super.setParam("user_id", userId);
}

public void startRequest(final VolleyCallback callback ) {
setUrlName("select_test.php");

request(callback);
}

public HashMap<String, String> jsondata(String data){
HashMap<String, String> resData = new HashMap<String, String>();

try{
JSONObject jsonobj = new JSONObject(data);

JSONArray jsonary = jsonobj.getJSONArray("result");

for(int i = 0; i < jsonary.length(); i++){
JSONObject obj = jsonary.getJSONObject(i);
resData.put("user_id", obj.getString("user_id"));
resData.put("test2", obj.getString("test2"));
resData.put("test3", obj.getString("test3"));
}

}catch (Exception e){
Log.d("json error ===", e.getMessage());
}

return resData;
}
}


TestActivity.java


import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.util.HashMap;

/**
* Created by jo on 2016-03-19.
*/
public class BusActivity extends BaseActivity {

TextView mTextView;
private HashMap<String, String> busList = null;

@Override
protected void createActivity() {
View view = this.setContainerView(R.layout.activity_bus);
getSupportActionBar().setTitle("테스트");

mTextView = (TextView) view.findViewById(R.id.text);

onBusRequest();
}

private void onBusRequest(){
BusRequest request = new BusRequest(this);
request.setParams("23");

request.startRequest(new Request.VolleyCallback() {
@Override
public void onSuccess(String result) {
Log.i("hahahah", result);
}
});
}

@Override
protected void destroyActivity() {

}

@Override
protected void viewClick(View view) {
if (view.getId() == R.id.btn_back) {
this.finish();
}
}

}


안드로이드 개발을 하고있는데

로그를 자주 찍다보니 로그캣창을 자주 보게 되는데

글자색이 크게 구분이 안가서 눈이 아팠다ㅠ


글자색을 바꾸기로 결심했다


////////////////////////////////////////


File -> Settings -> Editor -> Colors & Fonts -> Android Logcat   에 들어간다


그리고 Use inherited attributes를 체그해제하고 색상을 변경한다

Save As로 설정내용을 따로 저장하여 설정을 수정하는것이 좋은듯 하다


수정완료하고 Ok를 누르면 된다

'공부 > Android' 카테고리의 다른 글

HoloColorPicker 값 가져오기 HEX값  (0) 2016.05.11
(android volley) 공통화 하기  (0) 2016.05.08
(eclipse) svn plugin 설치  (0) 2016.04.15
(eclipse) Eclipse ADT Plugin 설치  (0) 2016.04.15
(Android Studio) naver svn 멤버추가  (0) 2016.04.04

json에대해 알아보고있는 중인데


[{"user_id":"1"},{"user_id":"2"},{"user_id":"3"},{"user_id":"4"}]


이런식의 jsonarray만 달랑 사용하지않고

주로


{

"result":[{"user_id":"2"},{"user_id":"23"},{"user_id":"23"},{"user_id":"23"}]

}


이런식의 jsonobject안에 jsonarray를 넣는식으로 많이 사용한다고 한다


그래서 기존의 jsonarray만 만들던 방식을 변경해서 위와같은

형식으로 만들어 보았다.


/////////////////////////////////////////////////////////////////


<?php 

header("Content-Type:text/html;charset=utf-8");

    include ('./db_info.php');



$connect = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

mysqli_query($connect, "SET NAMES 'utf8'");

if(!$connect){

echo "Error: Unable to connect to MySQL." . PHP_EOL;

echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;

echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;

exit();

}

mysqli_set_charset($connect, "utf8");

//mysqli_query($connect, "SET NAMES utf8");


if ($result = mysqli_query($connect,"SELECT * FROM TEST")){

$jsonarray = array();


while ($row = mysqli_fetch_object($result)) {

$obj = new stdClass();

$obj->user_id = $row->user_id;

$obj->test2 = $row->test2;

$obj->test3 = $row->test3;


$jsonarray[] = $obj;

unset($obj);

}


if(count($jsonarray) == 0){

$jsonobj["result"]="empty";

} else {

$jsonobj["result"]=$jsonarray;

}


} else {

$jsonobj["result"]="fail";

}


$encode = json_encode($jsonobj, JSON_UNESCAPED_UNICODE );

echo $encode;

mysqli_close($connect);

           

?>


///////////////////////////////
결과

{"result":[{"user_id":"23","test2":"하하","test3":"2016-04-12 00:00:00"},{"user_id":"123","test2":"히히","test3":"2016-04-05 00:00:00"},{"user_id":"1234","test2":"호호","test3":"2016-04-18 00:00:00"},{"user_id":"1235","test2":"크크","test3":"2016-04-24 00:00:00"}]}


'공부 > php' 카테고리의 다른 글

(php) json 한글 유니코드  (2) 2016.04.23
(php db연결) select 후 json 만들기  (1) 2016.04.23
(db연결) 레코드, 필드 개수 구하기  (0) 2016.04.23
(db연결) mysql_connect 연결 실패  (0) 2016.04.23

php에서 db에 연결하여 json형태로 데이터를 추출하여 

화면에 출력해보았는데


[{"user_id":"23","test2":"\ud558\ud558","test3":"2016-04-12 00:00:00"},{"user_id":"123","test2":"\ud788\ud788","test3":"2016-04-05 00:00:00"},{"user_id":"1234","test2":"\ud638\ud638","test3":"2016-04-18 00:00:00"},{"user_id":"1235","test2":"\ud06c\ud06c","test3":"2016-04-24 00:00:00"}]


이런식으로 한글부분에 \u 문자가 붙고 뒤에도 이상하게 나오는것을 확인하였다.


검색해보니

\u 는 유니코드 구분자라고 한다


받는쪽에서 디코드를 제대로 해주면 문제없이 한글데이터를 사용할 수 있다고 한다


잘못된 것이 아니니 그대로 진행하면 된다.


//////////////////////////////////////////////////////

4/27일 수정 


아무래도 저 유니코드 부분을 바꿔야 될 것 같아서 찾아본 결과

버전별로 많은 바꾸는 방법이 있었다.


함수를 이용해서 euc-kr을 utf-8로 일일이 바꾸는 방법,

유니코드를 한글로 보여주는 함수 등과 같은

여러가지 방법을 했는데 잘되지않았다


내가 아래 방식으로 디비연결을 하고 데이터를 가져와 json_encode를 이용해

json 오브젝트를 만들고있었는데


<?php 

header("Content-Type:text/html;charset=utf-8");

header("Content-Type:application/json");

    include ('./db_info.php');



$connect = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

mysqli_query($connect, "SET NAMES 'utf8'");

if(!$connect){

echo "Error: Unable to connect to MySQL." . PHP_EOL;

echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;

echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;

exit();

}

mysqli_set_charset($connect, "utf8");

//mysqli_query($connect, "SET NAMES utf8");


if ($result = mysqli_query($connect,"SELECT * FROM TEST2")){

$o = array();

while ($row = mysqli_fetch_object($result)) {


$t = new stdClass();

$t->user_id = $row->user_id;

$t->test2 = $row->test2;

$t->test3 = $row->test3;

$o[] = $t;

unset($t);

}

} else {

$o = array( 0 => 'empty');

}


$encode = json_encode($o);

echo $encode;

mysqli_close($connect);

           

?>



하여 encode를 출력하면 계속 한글부분이 유니코드로 

[{"user_id":"1","test2":"\ud558\ud558\ud558","test3":"2016-03-28"},{"user_id":"2","test2":"\ud638\ud638\ud638","test3":"2016-04-05"},{"user_id":"3","test2":"\ud788\ud788\ud788","test3":"2016-04-11"},{"user_id":"4","test2":"\ud14c\uc2b7\ud750\uc785\ub2c8\ub2e4","test3":null}]

이런식으로 나오는데 여러가지 해결방법을 시도해 보았지만 되지않았다.

///////////////////////////////////

그런데


echo json_encode($o, JSON_UNESCAPED_UNICODE)

위방법으로 하니

[{"user_id":"1","test2":"�섑븯��","test3":"2016-03-28"},{"user_id":"2","test2":"�명샇��","test3":"2016-04-05"},{"user_id":"3","test2":"�덊엳��","test3":"2016-04-11"},{"user_id":"4","test2":"�뚯듂�먯엯�덈떎","test3":null}]

이런식으로 나와 더 미궁에 빠졌는데


알고보니

header("Content-Type:application/json");   

json 헤더 선언부분, 이부분이 뭔가 이상한거 같아 지워서 출력해보니 


[{"user_id":"1","test2":"하하하","test3":"2016-03-28"},{"user_id":"2","test2":"호호호","test3":"2016-04-05"},{"user_id":"3","test2":"히히히","test3":"2016-04-11"},{"user_id":"4","test2":"테슷흐입니다","test3":null}]


이런식으로 제대로 나오기 시작했다.

해결을 하기는 했지만 원인은 아직 잘 모르겠다.


db연결 후 select한 값을 json형태로 추출하고 싶다면

아래와 같이 하면 된다


db에 user_id, test2, test3이라는 컬럼이 있다고 가정하에..


사용버전 = 

PHP Version 5.5.9-1ubuntu4.14


//////////////////////////////////////////////////////////

db_info.php


<?php

define('DB_HOST', 'ip입력');

define('DB_USER', 'root');

define('DB_PASSWORD', '비밀번호입력');

define('DB_NAME', 'db이름 입력');

?>


//////////////////////////////////////////////////////////

test.php


<?php

 header("Content-Type:text/html;charset=utf-8");

header("Content-Type:application/json");

  include ('./db_info.php');


$connect = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);


if(!$connect){

echo "Error: Unable to connect to MySQL." . PHP_EOL;

echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;

echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;

exit();

}

mysqli_set_charset($connect, "utf8");

//mysqli_query($connect, "SET NAMES 'utf8'");


if ($result = mysqli_query($connect,"SELECT * FROM TEST")){

$o = array();

while ($row = mysqli_fetch_object($result)) {


$t = new stdClass();

$t->user_id = $row->user_id;

$t->test2 = $row->test2;

$t->test3 = $row->test3;

$o[] = $t;

unset($t);

}

} else {

$o = array( 0 => 'empty');

}

echo json_encode($o);

  echo json_encode($o, JSON_UNESCAPED_UNICODE);


mysqli_close($connect);

           

?>



//4월 27일 수정


한글이 유니코드로 출력되어 코드 수정


header("Content-Type:text/html;charset=utf-8"); 추가

header("Content-Type:application/json"); 삭제

echo json_encode($o); 수정






'공부 > php' 카테고리의 다른 글

(json) jsonobject 안에 jsonarray  (0) 2016.04.28
(php) json 한글 유니코드  (2) 2016.04.23
(db연결) 레코드, 필드 개수 구하기  (0) 2016.04.23
(db연결) mysql_connect 연결 실패  (0) 2016.04.23

<?php

include ('./db_info.php');


$connect = mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD);


$connect = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);


if(!$connect){

echo "Error: Unable to connect to MySQL." . PHP_EOL;

echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;

echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;

exit();

}


if ($result = mysqli_query($connect,"SELECT * FROM TEST")){


$total_record = mysqli_num_rows($result); //레코드 개수

$total_fields = mysqli_num_fields($result); //필드 개수

}

?>



'공부 > php' 카테고리의 다른 글

(json) jsonobject 안에 jsonarray  (0) 2016.04.28
(php) json 한글 유니코드  (2) 2016.04.23
(php db연결) select 후 json 만들기  (1) 2016.04.23
(db연결) mysql_connect 연결 실패  (0) 2016.04.23

$connect = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);


if(!$connect){

echo "Error: Unable to connect to MySQL." . PHP_EOL;

echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;

echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;

exit();

}


php에서 이런식으로 db연결을 시도 하고있는데 

연결 실패했다.


Host 'ip' is not allowed to connect to this MySQL server


이런 에러내용을 출력했는데

검색해보니 로컬호스트로는 접근가능한데 ip로 접근하려면

해당 ip에 권한을 줘야 접근할수 있다고 한다.


터미널에서 mysql -u root -p 해서 들어가서 접근할때는 잘됬는데

php에서 mysqli_connect 했을 때 접근이 안된다면 권한설정을 확인해야 한다


///////////////////////////////////////////


터미널에서 mysql -u root -p 를 이용해 접속한 후


mysql> use mysql

mysql>SELECT Host, User, Select_priv, Insert_priv,Update_priv, Delete_priv FROM user;


이렇게 입력하면 현재 권한 설정 정보를 볼수 있는데

이곳에 해당 ip가 빠져있다면 접근 불가능 한 것이다


ip접근 권한을 추가하려면


mysql> GRANT ALL PRIVILEGES ON *.* TO root@[ip주소] IDENTIFIED BY ['비밀번호'] WITH GRANT OPTION;

ex) GRANT ALL PRIVILEGES ON *.* TO root@12.34.56.77 IDENTIFIED BY '12345' WITH GRANT OPTION;


이렇게 해주면 된다


모든 ip를 추가하려면

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY '12345' WITH GRANT OPTION;

이렇게 ip 대신 "%" 를 입력해 주면 된다

'공부 > php' 카테고리의 다른 글

(json) jsonobject 안에 jsonarray  (0) 2016.04.28
(php) json 한글 유니코드  (2) 2016.04.23
(php db연결) select 후 json 만들기  (1) 2016.04.23
(db연결) 레코드, 필드 개수 구하기  (0) 2016.04.23

C에서는 변수를 무조껀 상위에 선언해야하지만

(ex)

int a=0;

int b=1;

int c=2;


a = b+c;



C++에서는 중간에 선언하여도 사용할 수있다고 하여 (물론 해당 변수를 사용하기 이전)


(ex)

int a=0;

int b=1;


a = b;


int c = 2;

a = a + c;


//////////////////////////////////////////////////


for문에서 


for (i = 0; i < N; i++) {

for (int j = 0; j < N; j++) {

cout << "hahah";

}

}


이런식으로 자주 썼었는데 문득 for문안의 저 'int j'가 

for문 밖에서도 선언된 상태인지 궁금하여


for (i = 0; i < N; i++) {

for (int j = 0; j < N; j++) {

cout << "hahah";

}

cout <<  j;

}


이렇게 j를 출력해보았는데 안되었다. ( 'j'가 선언되지 않은 식별자라고 에러표시된다 )


선언된 변수는 {    } 안에서만 사용가능하고 {   } 를 빠져나오게 되면

없어지는 것 같다.


char input[100][100] = {0};

cout << "N을 입력 : ";

cin >> N;

while (i < N) {

cin.getline(input[i], 100);

i++;

}


이런식으로 N번의 문자열을 받는 프로그램을 짜고 실행하였는데

N = 3 이라면 3번을 입력받아야 하는데

2번밖에 입력안받는 현상이 생겼다.

버퍼에 남아있는 문자때문에 그렇다고 생각되어


C언어를 할때 쓰던

fflush(stdin);

을 사용하여 버퍼를 비워 보았는데 비워지지 않았다ㅠ


그래서 찾아본 결과


cin.ignore() 로 입력버퍼를 비울 수 있다는 것을 알게되었다.


//////////////////////////////////////////////////////////


char input[100][100] = {0};

cout << "N을 입력 : ";

cin >> N;


cin.ignore();

while (i < N) {

cin.getline(input[i], 100);

i++;

}


///////////////////////////////////////////////////////////


이런식으로 버퍼를 지워주니 getline에서 잘 입력받아 주었다.

이클립스 Help 메뉴의


Eclipse Marketplace에 들어갑니다



svn을 검색하여 맨위에 Subversive의 install 을 클릭하여 밑에 과정에 따라 설치한다






이렇게 설치가 끝나면 이클립스를 리스타트 하게 됩니다

그리고 open perpective 를 선택하여

SVN Repository Exploring을 선택하게 되면.....






밑에 창이 뜨는 것을 확인 할 수 있는데

svn 커넥터를 설치해줘야 svn을 사용할 수 있기때문에 설치해줍니다

SVN kit 1.8.11을 설치해 줍니다




설치완료하면 svn 설정 완료입니다







이클립스 설치 후  (저는 Version: Mars.2 Release (4.5.2) 설치함)


메뉴에서 Help에서  Install new software를 선택합니다


그리고 Add를 누르고


Name 에는 ADT

Location 에는 https://dl-ssl.google.com/android/eclipse/


를 입력하고 OK를 누르면 아래와 같이 생깁니다

Developer Tools를 체크한 후 next 한 다음 동의를 하고 피니쉬를 누릅니다.


그러면 이클립스를 리스타트 합니다.





이클립스가 리스타트 되면 sdk경로를 잡아주라고 하는데

sdk를 설치한 경로를 잡아주면 됩니다. (sdk설치는 따로 설명하지 않습니다)




typedef struct english {

char word[50]; //단어

char mean[100]; //뜻

struct english* chain = NULL;

}ENGLISH;


ENGLISH* tmp = (ENGLISH *)malloc(sizeof(ENGLISH));


이런식으로 동적할당을 받아서 char배열에 값을 넣고 쓸 때


쓰레기 값들이 한번씩 나왔던것 같다.


물론 구조체 안에서 각 멤버들을 초기화 해주어도 되지만


나는 할당을 받고나서 memset을 이용하여 초기화를 해준다.


///////////////////////////////////////////////////////////


ENGLISH* tmp = (ENGLISH *)malloc(sizeof(ENGLISH));

memset(tmp, 0, sizeof(ENGLISH));


///////////////////////////////////////////////////////////


이렇게 해주면 한번에 해당 메모리를 원하는 문자로 초기화 할 수 있다.


=================================================



원형 : void * memset(void *ptr, int value, size_t num);


ptr은 시작 주소

value 해당 공간을 채울 값

num은 시작 주소부터 얼마만큼 value로 채울지 (size)



accumulate 모으다; 축적하다

accustomed 익숙한

achieve 이루다, 성취하다


이런식으로 들어가 있는 txt 파일을 읽으려고 하니 


char buffer[100];


while (!file.eof()) {

file >> buffer;

}


이런식으로 읽게되면 공백단위로 읽게되어 (모으다; 축적하다) 가 한번에 들어가야되는데


(모으다;) 따로 (축적하다) 따로 들어가게 된다.


영어단어와 뜻 사이에 있는 탭( '\t' ) 으로 구분하여 잘라서 사용하고 싶다면


strtok을 사용하면 된다!


////////////////////////////////////////////////////////


char* token = NULL;

char tk[] = "\t\n";

char buffer[100];

ENGLISH *tmp = NULL;


while (!file.eof()) {

memset(buffer, 0, sizeof(buffer));

file.getline(buffer, 100);


token = strtok(buffer, tk);

strcat(tmp->word, token);


token = strtok(NULL, tk);

strcat(tmp->mean, token);

}



이런식으로 getline으로 한줄을 받은 후


strtok 을 사용하여 특정 token단위로 잘라서 사용해주면 될 거 같다.


//////////////////////////////////////////////////////


원형


char* strtok(char* str, const char* delimiters);


str은 대상 문자열

delimiters는 구분자, 무엇으로 구분할 것인가를 문자열 형태로 지정


분리한 결과의 첫번째 주소값을 리턴



///////////////////////////////////////////////////////////////


중요!!!!!!!!!!!!!!!!!


token = strtok(NULL, tk);    을 쓰는 이유


첫번째 인자로 문자열의 주소값이 들어오면 거기서부터 분리를 시도하는데


만약 NULL이 들어오면 이전에 자기가 기억한 곳으로부터 분리 시도!!!!!!!

네이버 개발자센터에서 프로젝트관리로 들어간 후 


멤버관리에서 사용자 추가를 누른후 


멤버로 등록할 사람의 네이버 아이디를 입력하고 추가하면


그 아이디로 메일이 날라간다.


그 메일을 확인해서 비밀번호를 설정하면


15분후 프로젝트에 접근가능해진다.

visual studio 2015로 C++과제를 하고있었는데


'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. 


이런 에러가 막 발생했다.


검색해보니 에러가 아니라 해당 함수가 보안적인 면에서 취약하다고 말해주는 경고메세지라고 한다.


str~~~ 종류의 함수들이 이런 경고를 다 표시하는 것 같다.


//////////////////////////////////////////////////////////////


strcpy_s 같이 뒤에 _s를 붙여 보안적인면이 추가된 함수를 사용해도 좋고


그냥 그대로 사용하고 싶다면


#pragma warning ( disable : 4996 )

이 코드를 이용해 경고를 무시해줘도 된다.



이미지뷰나 이미지버튼의 src

이미지를 넣었는데 너무 커보이거나, 공백을 없애거나, 영역에 안맞춰져 보일 때


setScaleType을 쓰면 조절 가능 하다


///////////////////////////////


<ImageButton
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00000000"
android:src="@drawable/btn_back"
android:scaleType="centerInside" //이 부분
/>


////////////////////////////////


MATRIX = 원본 크기 그대로 보여줌 (왼쪽상단 정렬) 
CENTER = 원본 크기 그대로 보여줌 (가운데 정렬)
CENTER_CROP = View 영역에 공백이 있으면 채워서 보여줌(비율유지)
CENTER_INSIDE = View 영역을 벗어나면 맞춰서 보여줌(비율유지)
FIT_START = View 영역에 맞게 보여줌 (왼쪽상단 정렬, 비율유지)
FIT_CENTER = View 영역에 맞게 보여줌 (가운데 정렬, 비율유지)
FIT_END = View 영역에 맞게 보여줌 (왼쪽하단 정렬, 비율유지)
FIT_XY = View 영역을 가득 채워서 보여줌(비율유지 안함)


drawable 폴더에 이미지를 넣으려고 하는데


원래 나는 drawable-xxhdpi 폴더에만 고해상도 파일을 넣어놓고 다른 폴더에는

넣어놓지 않았었는데

폴더별로 해상도크기에 맞춰 넣어놓는 것이 좋다는 이야기를 들었다.


폴더별 해상도는


◎ drawable-hdpi(high) : 고화질 ~240 dpi


◎ drawable-ldpi(low) : 저화질 ~120 dpi


◎ drawable-mdpi(medium) : 중간화질 ~160 dpi


◎ drawable-xhdpi(extra-high) : ~320dpi


◎ drawable-xxhdpi(extra-extra-high) : ~480dpi



//////////////////////////////////



고해상도 파일을 이용해 자동으로 저해상별로 파일을 만들어 주는 사이트


http://romannurik.github.io/AndroidAssetStudio/icons-launcher.html#foreground.space.trim=1&foreground.space.pad=0&foreColor=607d8b%2C0&crop=0&backgroundShape=square&backColor=ffffff%2C100&effects=none




현재 클래스의 이름을 가져오려면


public String getClassSimpleName() {

        return this.getClass().getSimpleName();

}


요걸 사용하면 되고


/////////////////////////////////////////


패키지 + 클래스 이름을 원하면


public String getClassName() {

        return this.getClass().getName();

}


요걸 사용하면 된다

개발하다 보면 APP을 종료해도 저장되있는? 그런 저장 공간이 필요하다.


예를들어 환경설정에서 설정한 내용을 저장해서 APP을 실행할 때 저장한 설정 내용을 불러오거나 


간단한 데이터를 저장해 놓앗다가 가져오거나 할 때 preference를 사용하면 편리하다


/////////////////////////////////////////////////////////

Preferences.java


public class Preferences {

protected SharedPreferences preferences;
protected SharedPreferences.Editor editor;

public Preferences(Context context) {
this.preferences = context.getSharedPreferences("APPNameData", context.MODE_PRIVATE);
this.editor = this.preferences.edit();
}

public boolean getBoolean(String key) {
return this.preferences.getBoolean(key, false);
}

public boolean getBoolean(String key, boolean defValue) {
return this.preferences.getBoolean(key, defValue);
}

public void putBoolean(String key, boolean value) {
this.editor.putBoolean(key, value);
this.editor.commit();
}

public String getString(String key) {
return this.preferences.getString(key, "");
}

public String getString(String key, String defValue) {
return this.preferences.getString(key, defValue);
}

public void putString(String key, String value) {
this.editor.putString(key, value);
this.editor.commit();
}
//밑으로는 실제로 사용할 데이터 get set

public boolean isPushIdInsert() {
return this.getBoolean("PUSH_STATE_INSERT", false);
}

public void setPushIdInsert(boolean value) {
this.putBoolean("PUSH_STATE_INSERT", value);
}

public String getMainWebUrl() {
return this.getString("MAIN_WEB_URL", "def_data_str");
}

public void setMainWebUrl(String value) {
this.putString("MAIN_WEB_URL", value);
}

}




//////////////////////////////////////////////////////////////////////

MainActivity.java


public class MainActivity extends AppCompatActivity{

private Preferences preference;

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

preference = new Preferences(this);
 

//사용법
setupWebview(preference.getMainWebUrl());

//preference에 저장되어있는 MainWebUrl String을 가져온다

}

}




'공부 > Android' 카테고리의 다른 글

(Android) drawable 이미지 관리  (0) 2016.03.21
(Android) class 이름 가져오기  (0) 2016.03.20
(에러) Default Activity not found  (1) 2016.03.08
(Android) 키 해시 구하기  (1) 2016.03.07
(Android) WebView 사용법  (0) 2016.03.06

자바에서 배열을 복사할 때 


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

arr2[i] = arr1[i];

}


이런 식으로 반복문을 이용해 복사했었는데


System.arraycopy() 함수를 사용하면 간편하게 할 수 있다.


//////////////////////////


public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

src = 복사하고자 하는 배열. 복사 당하는?. 원본


srcPos = 배열에서 어느 부분부터 읽어올지 위치 (index)


dest = 복사하려는 곳, 대상


destPos = 어느 부분부터 쓸지 위치 (index)


length = 원본에서 얼마만큼 읽어올지

///////////////////////////


ex)

     arraycopy(arr1, 0, arr2, 0, arr1.length);

오랜만에 java공부를 위해 이클립스 (루나 ver)을 설치했는데


원인을 모르겠지만 sysout을 쓴 후 컨트롤 + 스페이스 를 누르면 

System.out.println();

이렇게 변환되던 기능이 되지 않아 찾아보았다.


  1. Go to Windows->Preferences->Java->Editor->Templates
  2. Select sysout template and edit it.
  3. Change the context from Java statement to Java.
이런 검색결과가 있어 해보니 잘 되었다.

해석하자면 

Windows->Preferences->Java->Editor->Templates 에 들어가서

sysout 항목을 edit 누른 후

context 항목을 Java statement 에서 Java로 바꾸어 주면 

잘된다는 뜻이다.


왜 변환이 안되었던 것인지는 자세히 더 알아봐야 할 것 같다.


Could not identify launch activity: Default Activity not found


이런 에러가 날 때가 있다.

////////////////////////////


불러오려는 Activity가 정의? 되어 있지 않아서 찾지 못하여 에러가 나는 것 같다.

보통 Activity를 생성하면 AndroidManifest.xml 에 등록하는데


이 과정에서 AndroidManifest.xml에 잘 못 등록 되었거나, 등록되지 않았을 때

에러가 발생한다.


보통 나 같은 경우에는 급하게 해서

AndroidManifest.xml에서 </activity> 태그를 빠뜨리거나 잘 못써서

에러가 한번씩 났었다.

카카오 api를 사용하려고 kakaoDevelopers 에서 개발가이드를 보며

따라하고 있는데 앱 생성/등록을 하여야 되서 하고있던 중에


키해시를 등록해야만 가능하다 해서 가이드에 있는

keytool을 이용한 방법, openssl을 이용한 방법 등을 해보았는데

나는 둘다 할 수 없었다. 


(cmd에서 keytool을 써서 해보니 키가 제대로 나오지 않고 깨어진?글자들이 나왔고

openssl을 쓰니 base64 부분에서 에러가나면서 openssl이 종료되었다.)


그래서 다른 방법을 알아보던 중

메소드를 이용해 로그를 찍어 해시 키를 구하는 방법이 있는 것을 알았다.


///////////////////////////////////


private void getAppKeyHash() {
try {
PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md;
md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String something = new String(Base64.encode(md.digest(), 0));
Log.d("Hash key", something);
}
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("name not found", e.toString());
}
}


//////////////////////////////////


이렇게 하고 getAppKeyHash(); 을 실행하면

로그부분에 D/Hash key: !#()%*&!#(%*&)!%)!= 이런식으로 찍히는 것을 확인 할 수 있다.


toByteArray에서 에러가 생긴다면 import를 잘못한 것이다. (Signature 부분 import를 확인해보기 바랍니다)

(android.content.pm.Signature; 이거로 임포트 되어야 함)


웹뷰는 웹페이지를 보여주는 위젯


/////////////////////////

MainActivity.java


private WebView  mainWebView;


@Override

protected void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);

     setContentView(R.layout.activity_main);


     mainWebView = (WebView ) findViewById(R.id.main_web_view);


     mainWebView.getSettings().setJavaScriptEnabled(true);

     mainWebView.getSettings().setSavePassword(true);

     mainWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

     mainWebView.getSettings().setAppCacheEnabled(true);

     mainWebView.getSettings().setSupportMultipleWindows(true);

     mainWebView.getSettings().supportZoom();


     mainWebView.loadUrl("https://m.facebook.com");

}



/////////////////////////

content_main.xml


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

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

    xmlns:app="http://schemas.android.com/apk/res-auto"

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

    android:id="@+id/main_r_view"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    app:layout_behavior="@string/appbar_scrolling_view_behavior"

    tools:context="~~~~~~~~~~~~"

    tools:showIn="@layout/activity_main">


    <WebView

        android:id="@+id/main_web_view"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_margin="8dp">

    </WebView>


</RelativeLayout>


※ 물론 AndroidManifest.xml 에 
<uses-permission android:name="android.permission.INTERNET" /> 
권한 추가

/////////////////

webview에 여러가지 기능들을 입힐 수 있는데 
자세한 설명은

참조




웹뷰를 구현하고 테스트 하다 보면 뒤로가기가 이상하다는 것을 느낄 수 있다.

웹페이지에서 링크를 타고 다른 페이지로 넘어간 뒤

뒤로가기 버튼을 누르면 이전페이지가 나올것 같지만 그렇지 않다.

앱이 종료되거나 액티비티가 종료되고 이전 액티비티로 넘어간다.


해결방법은

////////////////////////////////


@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {


    if((keyCode == KeyEvent.KEYCODE_BACK) && mainWebView.canGoBack()){

        mainWebView.goBack();

        return true;

    }

    return super.onKeyDown(keyCode, event);

}

위 소스를 추가해주면된다


onKeyDown 는 키가 눌러지는 것을 확인하는 리스너인데


뒤로가기 키가 눌러졌을 때 

뒤로갈 페이지가 있다면(  mainWebView.canGoBack())  )

페이지 뒤로가기를 하고

없다면 원래 뒤로가기 기능을 수행하게 한다.



android 에서 웹페이지를 띄우기 위해서는 webview를 사용하면 된다


밑에 구조는 content_main.xml을

activity_main.xml 이 include하고 있는 형태다


/////////////////////


content_main.xml


<WebView

    android:id="@+id/main_web_view"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

</WebView>

/////////////////////


MainActivity.java


public class MainActivity extends AppCompatActivity {

    private WebView  mainWebView;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        mainWebView = (WebView ) findViewById(R.id.main_web_view);


        mainWebView.getSettings().setJavaScriptEnabled(true);

        mainWebView.loadUrl("http://m.naver.com");


    }

}


///////////////////////


이렇게하면 webview를 배치했던 곳에 모바일 네이버가 띄게 된다.


웹페이지를 띄우는 것이기 때문에 당연히 

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

권한이 필요하다.



svn연동을 하고 commit테스트를 하려고 보니 

Local Changes에 엄청나게 많은 소스들(변경되어 커밋 할수있는..)이 표시 되어 있었다.


항목을 눌러 자세히 보니 build폴더안의 파일들, gradle안의 파일들 등

커밋 할 필요없는 파일들도 커밋 항목에 올라가 많아 보였던 것이다.


커밋체크가 필요하지 않는 파일들은 ignore (무시) 를 해주면 되어

하는 방법을 검색 후 ignore 해보려 했지만 계속 실패 했다.

(해당 폴더 또는 파일 오른쪽 클릭 후 subversion -> ignore 에 들어가는 메뉴가 

 애초에 클릭이 안되어 좀 이상했다.)


여러가지 방법이 있었는데



1) svn:ignore에다가 하면된다.

-> svn:ignore을 찾을 수 없었음


2) File -> settings -> version control -> ignored Files 에서 등록

-> 등록은 해보았는데 ignore 되지 않았다.


3) .gitignore 파일에서 등록

-> 구글에서 검색하니 .gitignore에 등록하는 방법은 git을 사용할 때만 되는 것이 아니라

   svn에서도 통한다고 해서 설정 해보았는데 이것도 안되었다.


4) Tortoise SVN 설치

-> 나는 Apache Subversion을 연동하여 사용했는데 구글에 검색하니 Tortoise SVN을 사용하면

    된다고 하는 것 같아 해보려했지만 귀찮아서 해보지 못했다.


위에 방법으로 다 안되거나 해보지 못하여

결국 선택한 방법은


VCS -> commit Changes에서 커밋 할 필요없는 폴더를 오른쪽 클릭 후

Move to another changelist 를 선택하여 default 리스트에서 빼버렸다.


이렇게 하고 change list를 default를 해놓고 커밋을 하니

내가 원하는 파일들만 커밋 되었다.


약간 완벽하지 않은 방법이긴 하지만 간편하게 할 수 있는 방법이다.

소스 형상관리를 위해 git을 써보려다 git은 private (비공개)로 하려면 돈이 들어서


네이버 svn 을 이용해서 안드로이드 스튜디오와 연동해 보았다.


/////////////////////////////////////////////////////////////////////


우선 네이버 개발자센터에서 로그인 후 -> 오픈 소스 -> 오픈 프로젝트 -> 프로젝트 등록

에서 이름, 아이디, 공개설명, 관리시스템 항목을 입력하고 확인을 누른다.


그리고 만든 프로젝트로 들어가서 왼쪽 메뉴에 프로젝트 관리 -> 공개정보 에서

모두 비공개로 설정 후 확인을 누른다


왼쪽 코드 -> 코드 트리보기 를 눌러 비밀번호를 바꾸고 15분 기다린다.


15분 기다린 후 다시들어와 보면 코드 트리가 생성되있는 것을 확인 할 수 있다.


여기까지 네이버에 svn 저장공간을 만든거고


///////////////////////////////////////////////////////////////////


이제는 안드로이드 스튜디오와 연동을 하고 

작업중이던 프로젝트나 작업하려는 프로젝트의

파일을 저장소에 올려놓는 작업(import)을 하겠다.


안드로이드 스튜디오는 svn프로그램이 설치되어있지 않으니

설치해주고 연동을 해주어야 한다.


https://www.visualsvn.com/downloads/

이곳에 들어가서 Apache Subversion command line tools 을 설치 후 

적당한 곳에 압축을 풀어놓는다.


안드로이드 스튜디오(이하 안스) 를 실행하여 File -> settings 로 들어가

verision control 의 subversion에 들어가서 

use command line client에 설치한 svn의 경로 (bin안의 svn.exe)를 지정 해 준다.


여기까지 안스와 설치한 svn이 연동되었고

네이버 svn 과 연동해 보겠다.


//////////////////////////////////////////////////////////////////////////////////////


안스에서 file -> new -> project form version control -> surbversion 에 들어가

플러스 버튼을 누른 후 

네이버 개발자센터에서 코드트리보기 항목에서 보았던 https://dev.naver.com/svn/아이디   주소를 입력한다.


이렇게하면 네이버 svn 저장소와 연동된것이다.


////////////////////////////////////////////////////////////


다음은 최초 프로젝트를 저장소에 올려야 하는데 (import)


안스에서 vcs -> import into  version control -> import into subversion 을 누른다


실행된 팝업창에서 trunk 폴더 밑에 해당 프로젝트 이름으로 폴더를 하나 더 생성하고 확인을 누른 후


만든 폴더를 선택하고 import를 누른다


그러면 import할 프로젝트의 경로를 지정하는 창이 뜨는데

그 창에서 최초의 프로젝트 파일을 선택 해 준다.


commit message 를 대충 ( ex) project start!! ) 써준 후 ok를 누르면 import 된다


아이디와 비밀번호 입력 창이 나오면 네이버 개발자센터에 로그인햇던 아이디와 

소스트리보기에서 설정했던 비밀번호를 입력하면 된다.


import가 끝나면 네이버 개발자센터에서 소스트리 보기 항목에서

최초의 프로젝트 소스가 올라가 있는 것을 확인 할 수 있다.


여기까지가 최초의 프로젝트를 네이버 저장소에 옮겨놓은 것이 된다


/////////////////////////////////////////////////////////


이제 올려놓은 최초프로젝트를 내려받아야 하는데 


File -> new -> project from version control -> subversion 을 선택하여

trunk 밑의 만들었던 폴더를 선택한 후 check out 해주면 된다.



 


+ Recent posts