안드로이드 스튜디오 버튼리스너에서 값을 못 넘기는 경우 질문 입니다...



        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final String name = search.getText().toString();

               // Toast.makeText(SearchActivity.this, name, Toast.LENGTH_SHORT).show();

                String url = "http://000.000.000.000/search.php";

                JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, url, null,
                        new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject response) {
                                mResult = response;
                             //   Log.v("TAG", "변수의 값"+name.toString());
                                drawList();
                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Toast.makeText(SearchActivity.this, "DB 연동 에러", Toast.LENGTH_LONG).show();
                            }
                        }) {
                    @Override
                    private Map<String,String> getParams(){
                        Map<String,String> params = new HashMap<String, String>();
                        Log.v("TAG", "변수의 값"+name.toString());
                        params.put(KEY_TITLE, name);

                        return params;
                    }
                };

                jsObjRequest.setTag(SEARCHTAG);
                mQueue.add(jsObjRequest);
            }
        });

위의 버튼을 눌렀을 때, editText의 값을 string으로 받아와서 그 name라는 값을 getParams()의 params.put을 이용해서 php로 넘겨서 사용할 수 있게 해줄려고 하는데, 아예 private Map..getParams()로 넘어가질 않습니다. 로그를 이용하여 넘어가는지 확인을 했으나 넘어가질 않아서 이걸게 질문을 올립니다.

  • 2016년 06월 14일에 작성됨
    프로그래밍을 배우는 학생입니다

조회수 283


2 답변


좋아요
1
싫어요
채택취소하기

JsonObjectRequest는 getParams() 함수를 내부적으로 호출하지 않게 구현되어 있습니다. 생성자의 세번째 파리미터인 jsonRequest를 통해서만 Request Body를 전달할 수 있습니다. (올려주신 코드에서 null로 설정한 부분) 다음 샘플 코드를 참고하셔서 코드를 수정하세요.

Map<String, String> params = new HashMap<String, String>();
params.put("title", "foo");

JsonObjectRequest jsonObjRequest = new JsonObjectRequest
    (Request.Method.POST, url, new JSONObject(params), new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            ...
        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            ...
        }
    });

  • 위의 코드 처럼 수정을 했는데도 역시나 php로 값이 넘어가질 않네요...php 파일에선 $name=$_POST['name']을 사용해서 넘겨 받은 값을 사용하려고 하는데 뭐가 문제인지 모르겠네요..    상현   2016.6.14 21:27     

JsonObjectRequest를 사용하는 경우, 데이터를 Json 문자열로 전송하게 됩니다. 따라서 서버에서도 Json 문자열을 디코드 처리 후 가져와야 됩니다. 다음 링크에서 json_decode() 함수에 대한 설명 및 예제를 살펴보신 후 적용해보시기 바랍니다.

다른 방법은 클라이언트에서 JsonObjectRequest가 아닌 StringRequest를 사용하는 것입니다. StringRequest를 사용할 경우, Content-Type을 "application/x-www-form-urlencoded; charset=UTF-8"으로 전송하기 때문에 기존 서버 코드로 값을 받아 올 수 있을 것으로 보입니다.

StringRequest 변경 시 처음 올려주신 코드에서 JsonObjectRequest를 StringRequest로 변경 후 생성자 파라미터 정도만 수정하면 됩니다. 이때는 getParams()가 호출되기 때문에 기존 코드를 그대로 사용하시면 됩니다.


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close