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

조회수 2984회

        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()로 넘어가질 않습니다. 로그를 이용하여 넘어가는지 확인을 했으나 넘어가질 않아서 이걸게 질문을 올립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 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()가 호출되기 때문에 기존 코드를 그대로 사용하시면 됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)