InputFilter filterAlphaNum = new InputFilter() {
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                Pattern ps = Pattern.compile("^[a-zA-Z0-9]+$");
                if (!ps.matcher(source).matches()) {
                    return "";
                }
                return null;
            }
        };

// 정규표현식만 적용하는 경우
editText.setFilters(new InputFilter[] {
	filterAlphaNum
});

// 길이까지 제한하는 경우
editText.setFilters(new InputFilter[] {
    filterAlphaNum,
    new InputFilter.LengthFilter(5)
});

띄어쓰기, 특수문자, 한글은 들어갈 일이 없는 EditText를 구현하기위해서 쓴 코드입니다.

힌트키의 경우 3글자는 영문 2글자는 숫자이므로 이런식으로 했습니다.

 

Retrofit2를 사용해서 프로젝트를 했습니다. 서버와의 통신을 위해서 HttpURLConnection이나 Volley, Retrofit2를 사용 할 수 있다고 하는데 HttpURLConnection의 경우 하나하나 커스텀해서 만들어야 하기에 첨에 Volley를 사용했다가 Retrofit2가 사용하기에 편할 것같아 Retrofit2를 사용했습니다.

android studio로 프로젝트를 생성하면 build.gradle이 두개가 있는데 dependencies가 있는 그래들파일에다가 retrofit2와 converter-gson을 implement해줘야 합니다. gson은 통신해서 가져온내용을 파싱하기위한것이니 필수적인 요소입니다.
(def retrofit_version = "2.9.0"   <<<< 굳이 이렇게 안하고 그대로 숫자 넣어도 됩니다.)

retrofit 패키지를 생성하고 RetrofitAPI 인터페이스와 RetrofitClient 클래스를 생성합니다. 이름은 굳이 이럴 필요는 없지만 잘 모르시겠다면 똑같이 적어보시면됩니다.

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {
    private static final String BASE_URL = "이 곳에 사이트 주소를 적어주세요";

    public static RetrofitAPI getApiService() {
        return getInstance().create(RetrofitAPI.class);
    }

    private static Retrofit getInstance() {
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        return new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }

}

RetrofitClient 클래스의 내용입니다 BASE_URL의 끝에는 "   /   " 를 넣어주세요.

나머지 코드는 똑같이 쓰셔야합니다.

import com.samsan.xcapeapplication.vo.HintVO;
import com.samsan.xcapeapplication.vo.MerchantVO;
import com.samsan.xcapeapplication.vo.ThemeVO;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

public interface RetrofitAPI {
    @GET("api/주소/주소")
    Call<List<MerchantVO>> getMerchantList();

    @GET("api/주소/주소")
    Call<List<ThemeVO>> getThemeList(@Query("merchantCode") String merchantCode);

    @GET("api/주소")
    Call<List<HintVO>> getHintList(@Query("merchant") String merchant, @Query("themeCode") String themeCode);
}

어노테이션 보면 대충 아시겠지만 get방식으로 해당 주소를 가져오겠다는 거고 거기에 Call형식의 메소드로 가져옵니다. 가맹점 리스트, 테마 리스트, 힌트 리스트는 전부 리스트형식으로 가져올꺼기 때문에 Call<List<HintVO>>형식이 되는거고 리스트형식이 아니라면 Call<HintVO>형식으로 하시면 됩니다.

@Query 어노테이션은 주소 파라미터값이라 생각하시면 됩니다. 
BASE_URL/api/주소?merchantCode=asdf 이렇게요

/**
  * MainActivity
  */

Call<List<HintVO>> callHintList = getApiService().getHintList(merchantCode, themeCode);
                callHintList.enqueue(new Callback<List<HintVO>>() {
                    @Override
                    public void onResponse(Call<List<HintVO>> call, Response<List<HintVO>> response) {
                        Gson gson = new Gson();
                        
                        // 이 부분이 핵심
                        String test = gson.toJson(response.body());
                    }

 

 

MainActivity에서 실제 통신하는 코드 부분입니다. (실행부에는 SharedPreferences를 사용했기에 String test 부분으로 대체했습니다.)

인터페이스의 정의한 callHintList를 호출하면 callHintList.enqueue(new Callback<List<HintVO>>(){}로 결과값을 받을 수 있습니다.  response.body()를 gson.toJson으로 파싱해야 String값으로 변환할수있습니다.

안녕하세요.
"하루는 길고 일주일은 짧다" 라는 말이 있습니다. 분명 글쓴게 어제같은데 어째서 2주나 지났는지.. 내 시간 돌려줘!!!!!!!

근황은 저도 방탈출카페 했습니다. 재밌더라구요
강남역근처에 있는 "키이스케이프"에서 했습니다. 테마이름은 "그카지말라캤자나" 였는데 처음하는거였지만 개고수인 친구랑 하니까 결국 탈출에 성공을 했습니다 ㅋ.ㅋ 안에서 있었던일은 철저히 비밀을 지키기로 각서를 썼기때문에 저땜에 점포가 피해가지않도록 말은 아끼겠습니다.

확실히 해보니까 어떻게 해야할지 감이 왔습니다. 하지만 안드로이드 앱을 학원에서만 배웠고 솔직히 팀과제도 버스 탔기에 (학원 다닐 시절에는 자바조차도 이해를 못했음 ㅠ) 어떻게해야하나 막막했습니다.

가장 먼저 필요한것부터 하나하나 알아가면서 했습니다.

첫 화면
두 번째 화면

드롭다운메뉴를 HTML에선 <Select>로 사용했는데 안드로이드에서는 Spinner라는 이름이더라구요.

두 번째 화면에 도달했을 때 SharedPreference에 아무런 정보가없다면 Retrofit2로 통신해와서 가맹점리스트와 테마리스트를 받아와서 Spinner에 넣었습니다. 이후 여기서 하는 설정은 SharedPreference에 저장을 하고 앱을 껏다 켰다던가 화면이 바뀌었다가 다시 돌아왔을 때도 마지막에 한 설정이 적용되도록 구현했습니다.
또한 해당하는 가맹점과 테마의 요소가 선택되어 첫 화면으로 갔을 때는 받아온 힌트리스트도 저장해서 설정을 바꾸지않는이상 오프라인으로도 힌트리스트에 접근이 되게끔 했습니다.

기능적인 부분을 완전히 구현하면 디자인에 신경쓰려고 하는터라 지금은 매우 볼품없어 보이지만 최대한 마무리해서 또 올리도록 하겠습니다.

간단합니다

위에가 backgroundTint를 없애고 직접 drawable로 버튼의 속성을 만들어 적용시킨 모습이고
아래는 똑같이 속성을 적용햇지만 망할놈의 backgroundTint땜에 적용이 안된 모습입니다. 

정답

우리는 흔히 <Button 으로 쓰지만 이렇게하면 간단히 킹그라운드똥트적용을 피할수있습니다.

 

결론: <Button 쓰지말고 <androidx~~~~~~~~~~AppCompatButton쓰자... 버전마다 이름이 다를순있지만 꺽쇄쓰고 button만 쓰면 여러가지나오는데 모르겟다면 일단 적용시켜보고 되면 쓰도록하자. 

오늘은 webView로 인터넷 접속이 안될때 문제를 해결해보려합니다

 

1. res안에 xml 을 추가해주기

 

전 그림처럼 했습니다 Resource type도 XML 이름도 끝에 xml, Available qualifiers는 Network Code로!!

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

내용은 이거!
누구는 cleartextTrafficPermitted="false"해도 된다는데 해보니까 둘 다 됐습니다 ㅎㅎ

 

 

2. AndroidManifest.xml 열기

네모박스!

빨갛게 표시해놓은걸 쓰면 됩니당

 

이것은 단 두개의 동작만으로 실행시킬수있어 너무쉽죠? 안된다고 제게 따지지말아주세요 전 제가 성공한 방법을 공유하는겁니다..

+ Recent posts