1. 준비물

이미지 갤러리를 열 수 있게 버튼을 만들어서 가져오겠습니다.


        mGetImageFromGalleryButton = (ImageView) view.findViewById(R.id.btn_getgallery);
 
cs


여기에 setOnClickListener를 달아줍니다.


        mGetImageFromGalleryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            }
        });
cs


onClick() 안에 원하는 것을 채워주겠습니다.


2. 권한 획득 후 실행


                if(ActivityCompat.checkSelfPermission(getActivity(),
                        Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
                {
                    requestPermissions(
                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                            2000);
                }
                else {
                    startGallery();
                }
cs


이렇게 하면 권한 획득을 구현하게 됩니다. 권한이 있으면 자동으로 startGallery() 함수를 호출합니다.

지금까지 구현한 코드의 마지막에 써줘야 할 것이 있습니다.


        return view;
cs


이렇게 마무리 해주지 않으면 코드가 정상적으로 작동하지 않습니다.

갤러리를 열 때 필요한 코드가 또 있습니다.


    private void startGallery() {
        Intent cameraIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        cameraIntent.setType("image/*");
        if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
            startActivityForResult(cameraIntent, 1000);
        }
    }
cs


이 부분의 코드가 있어야 Intent를 이용해서 열 수 있습니다. Intent 는 새 화면이라고 생각하시면 됩니다.


1. 준비물

기본적인 구조는 다음과 같습니다.


            @Override
            public void onClick(View view) {
                if (returnUri != null) {
                    if (!mEditTextdialogOpenField.getText().toString().equals("")) {
                    }
                    else {
                        Snackbar.make(getView(), "You have to say any words", Snackbar.LENGTH_LONG).show();
                    }
                }
                else {
                    Snackbar.make(getView(), "You have to get any image from gallery", Snackbar.LENGTH_LONG).show();
                }
            }
cs


if 구문에 Snackbar를 등록한 형태입니다. 이제 이 안을 채울 것입니다. Dialog로부터 입력받은 텍스트가 존재하면 실행되는 구문입니다. 그렇지 않다면 Snackbar로 에러를 표시합니다.


2. 내용물


    
                        Bitmap bitmap = null;
                        try {
                            bitmap = getBitmapFromUri(returnUri);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
cs


이 것으로 비트맵을 가져옵니다. uri를 통해 비트맵을 열 수 있습니다. 비트맵은 그림파일이라고 생각하시면 됩니다.


                        File imageFile = null;
                        try {
                            imageFile = createFileFromBitmap(bitmap);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
cs


여기는 파일을 가져오는 부분을 구현했습니다. 이 파일을 이제 비동기통신으로 연결하겠습니다.

가져온 텍스트를 Retrofit에 실어주는 부분입니다. okHttpClient를 사용할 때엔 builder를 호출해서 생성해야 합니다. 그리고 interceptor()를 builder에서 호출하여 현재 activity의 view.getContext() 속성을 넣어줍니다.


                        String givenText = mEditTextdialogOpenField.getText().toString();
                        OkHttpClient client = new OkHttpClient();
                        OkHttpClient.Builder builder = new OkHttpClient.Builder();
                        builder.interceptors().add(new AddCookiesInterceptor(view.getContext()));
                        client = builder.build();
                        Retrofit retrofit = new Retrofit.Builder()
                                .client(client)
                                .addConverterFactory(GsonConverterFactory.create())
                                .baseUrl(Constants.BASE_URL)
                                .build();
cs


okHttpClient의 구현 방법에 주의하시기 바랍니다.

사전에 만들어 놓은 api 서비스가 있습니다. 이 api 서비스를 이용해서 사진을 다루겠습니다.


                        PostApiService postApiService = retrofit.create(PostApiService.class);
                        RequestBody requestFile =
                                RequestBody.create(MediaType.parse("multipart/form-data"), imageFile);
                        MultipartBody.Part body =
                                MultipartBody.Part.createFormData("image", makeImageFileName(), requestFile);
 
cs


좌표는 int혹은 string으로 다뤄질 수 있습니다. 이번엔 String 변수에 담겠습니다. 사용하실 때 편한 방법으로 값을 저장해두면 불러오거나 다시 저장할 때 유용합니다.


                        ReferSharedPreference preferenceCoordinates = new ReferSharedPreference(getContext());
                        final String lat = preferenceCoordinates.getValue("Lat", "13");
                        final String lon = preferenceCoordinates.getValue("Lon", "15");
                        String pointString = "{ \"longitude\": \""+lon+"\",     \"latitude\": \""+lat+"\" } ";
 
cs


Request할 Body 부분을 구현합니다. http통신이므로 request가 존재합니다.


                        RequestBody coordinatePoint =
                                RequestBody.create(
                                        MediaType.parse("multipart/form-data"), pointString);
                        RequestBody textToPost =
                                RequestBody.create(
                                        MediaType.parse("multipart/form-data"), givenText);
 
cs


이제 Retrofit를 이용해서 Call을 구현하면 됩니다. call은 서버에 요청하는 과정입니다.


                        Call<ResponseBody> call = postApiService.uploadFile(body, coordinatePoint, textToPost);
                        call.enqueue(new Callback<ResponseBody>() {
                            @Override
                            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                                Snackbar.make(getView(), "Success, posted at \n" + lat + "  , " + lon , Snackbar.LENGTH_LONG).show();
 
                            }
                            @Override
                            public void onFailure(Call<ResponseBody> call, Throwable t) {
                            }
                        });
cs


그 다음 ImageView를 정리합니다.


                        mImageview.setImageBitmap(null);
                        returnUri = null;
                        mEditTextdialogOpenField.setText("");
cs


이러면 전송 후 이미지뷰가 깨끗해집니다. 이미지가 계속 남아있으면 다음 요청시에 에러가 발생할 수 있기 때문입니다.

1. 준비물

Glide, 서비스할 API와 Model들을 가져옵니다.


import com.bumptech.glide.Glide;
import com.example.keepair.myapplication.apiservice.LoginApiService;
import com.example.keepair.myapplication.apiservice.PostApiService;
import com.example.keepair.myapplication.helper.Constants;
import com.example.keepair.myapplication.loginhelper.AddCookiesInterceptor;
import com.example.keepair.myapplication.loginhelper.ReferSharedPreference;
import com.example.keepair.myapplication.model.Point;
import com.example.keepair.myapplication.model.PostData;
cs


버터나이프를 쓸 것입니다. 버터나이프는 뷰를 가져올 때 편리한 도구입니다.

그리고 okhttp3를 써서 json 데이터를 다루기 편하게 할 것입니다.


import butterknife.Bind;
import butterknife.OnClick;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import okio.BufferedSink;
cs


Retrofit를 이용해서 비동기통신을 구현할 것입니다. 

Retrofit : http://square.github.io/retrofit/

Retrofit 한글 번역 : http://devflow.github.io/retrofit-kr/


import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.POST;
cs


2. 레이아웃

레이아웃을 가져옵니다.


    ImageView mGetImageFromGalleryButton;
 
    ImageView mImageview;
    TextView mEditTextdialogOpenField;
    Uri returnUri;
cs


여러가지 View는 inflater를 이용해서 가져옵니다. 앞으로도 view를 가져올 땐 inflater의 inflate 함수를 이용할 것입니다.


        View view = inflater.inflate(R.layout.fragment_green, container, false);
        customImageview = (ImageView) view.findViewById(R.id.iv_beforesendpost);
        customEditTextdialogOpenField = (TextView) view.findViewById(R.id.tv_textToPost);
        setRetainInstance(true);
 
        mEditTextdialogOpenField.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                openDialog();
            }
        });
cs


가져온 뷰에 각기 onClickListener를 달아줍니다. 레이아웃상의 버튼을 클릭하면 일정한 동작이 구현되게 할 수 있습니다.


        view.findViewById(R.id.btn_post).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            }
        }
cs


이렇게 하게 되면 기본적인 세팅이 완성됩니다.

Activity는 java android 프로그래밍에서 핵심이 되는 부분입니다. 이 부분에서 여러가지 프로그래밍적인 설정을 할 수 있습니다. 레이아웃과의 연동을 위해 우선은 (ImageView), (TextView) 등을 가져온 부분을 주의깊게 봐주시기 바랍니다.


다음 포스트에서 계속하겠습니다.



1. 먼저 뷰를 가져옵니다.

레이아웃과 java파일을 연결해줍니다. PhotoViewAttacher는 나중에 다시 설명하겠습니다.

    private void configViews() {
        mImage = (ImageView) findViewById(R.id.iv_photo_detail);
        mPhotoViewAttacher = new PhotoViewAttacher(mImage);
        mText = (TextView) findViewById(R.id.tv_text_detail);
        mAuthor = (TextView) findViewById(R.id.tv_author_detail);
        mTime = (TextView) findViewById(R.id.tv_time_detail);
    }
cs


2. 시간의 단위를 정합니다.

static final int 로 개별 변수를 지정했고 TIME_MAXIMUM이라는 모델로 묶었습니다.

    private static class TIME_MAX{
        public static final int SEC = 60;
        public static final int MIN = 60;
        public static final int HOUR = 24;
        public static final int DAY = 30;
        public static final int MONTH = 12;
    }
cs


3. 모듈을 import합니다.


import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone;
cs


4. 시간 계산 함수를 만듭니다.

case문을 사용하는 것보다 if문을 사용하는 것이 가독성이 좋을 것 같습니다.
위에서 지정한 SEC 값보다 변화된 시간이 작으면 just now를 반환합니다. 그렇진 않지만 MIN보다 SEC가 작다면 minutes ago를 반환합니다. 이런식으로 이어지다가 결국 years ago를 반환하게 됩니다. 여기서 문제는 1년도 years ago라고 반환하므로 수정해서 사용하시면 됩니다.

    public static String formatTimeString(Date tempDate) {
        String msg = null;
        if (diffTime < TIME_MAX.SEC) {
            // sec 초
            msg = "just now";
        } else if ((diffTime /= TIME_MAX.SEC) < TIME_MAX.MIN) {
            // min 분
            msg = diffTime + " minutes ago";
        } else if ((diffTime /= TIME_MAX.MIN) < TIME_MAX.HOUR) {
            // hour 시간
            msg = (diffTime) + " hours ago";
        } else if ((diffTime /= TIME_MAX.HOUR) < TIME_MAX.DAY) {
            // day 날
            msg = (diffTime) + " days ago";
        } else if ((diffTime /= TIME_MAX.DAY) < TIME_MAX.MONTH) {
            // month 달
            msg = (diffTime) + " months ago";
        } else {
            msg = (diffTime) + " years ago";
        }
        return msg;
    }
 
cs


5. 시간 계산 함수에 필요한 단위를 만듭니다.

단위는 변수에 저장됩니다. System의 함수로 currentTimeMillis() 를 사용합니다. UTC시간을 이용해서 과거 기준 시간으로부터 지금까지 경과한 시간을 반환합니다. tempDate는 제가 만든 변수인데 여기엔 시간 데이터가 담깁니다. 그래서 getTime을 쓰면 위의 curTime과 연산이 가능하게 됩니다. 그 후 1000으로 나누면 초단위로 값이 계산됩니다.


        long curTime = System.currentTimeMillis();
        long regTime = tempDate.getTime();
        long diffTime = (curTime - regTime) / 1000;
cs


'Java' 카테고리의 다른 글

[android] 비트맵 파일 retrofit 통신 예제  (0) 2018.02.03
[android] Activity 구현 팁  (1) 2018.02.03
[android] Glide와 intent 사용하기  (0) 2018.02.03
[android] 구글맵 3  (0) 2018.02.03
[android] 구글맵 2  (0) 2018.02.03

1. 준비물

구글에서 공개한 좋은 모듈이 있습니다. Glide라고 하는 모듈입니다.

Glide : https://github.com/bumptech/glide


import com.bumptech.glide.Glide;
cs


이렇게 하면 Glide를 쓸 수 있게 됩니다.


import com.example.keepair.myapplication.helper.Constants;
import com.example.keepair.myapplication.model.Flower;
cs


이 것은 제가 쓰는 모델입니다. 저는 모델을 Flower라고 작명했습니다.


import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone;
import uk.co.senab.photoview.PhotoViewAttacher;
 
cs

예외처리와 시간 데이터 처리를 위해 불러옵니다.


    private ImageView mImage;
    private TextView mAuthor, mText, mTime;
    private PhotoViewAttacher mPhotoViewAttacher;
    private Date mDateToUse;
    private String mStriingDate;

cs


데이터를 레이아웃에서 사용할 것이기에 불러와줍니다.


2. 구현 코드


public class DetailActivity extends FragmentActivity {}
cs


이 다음엔 이 안에 들어갈 코드를 구현합니다.


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_detail);
}
cs


Window.FEATURE_NO_TITLE 이 부분을 주의해야 합니다. 윈도우의 디스플레이 사이즈를 정해봅니다.


        Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int width = (int) (display.getWidth() * 0.7); //Display 사이즈의 70%
        int height = (int) (display.getHeight() * 0.9);  //Display 사이즈의 90%
        getWindow().getAttributes().width = width;
        getWindow().getAttributes().height = height;
 
cs


int 변수에 display의 값을 지정해줄 수 있습니다.

아래 코드는 날짜 양식을 정하는 코드입니다.


        Intent intent = getIntent();
        Flower flower = (Flower) intent.getSerializableExtra(Constants.REFERENCE.FLOWER);
        configViews();
        mStriingDate = flower.getCreated_date().substring(0, flower.getCreated_date().length()-1);
        java.text.SimpleDateFormat format = new java.text.SimpleDateFormat(
                "yyyy-MM-dd'T'HH:mm:ss.SSSSSS");
        format.setTimeZone(TimeZone.getTimeZone("GMT"));
        mDateToUse = null;
cs


"yyyy-MM-dd'T'HH:mm:ss.SSSSSS" 여기가 우리가 주로 알던 형식을 이용한 코드입니다. 

 Glide로 마무리하겠습니다.


         try {            mDateToUse = format.parse(mStriingDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
 
        mAuthor.setText(flower.getAuthor());
        mText.setText(flower.getText());
        mTime.setText(formatTimeString(mDateToUse));
        Glide.with(getApplicationContext()).load(flower.getImage()).into(mImage);
cs


Glide로 가져온 이미지를 flower 모델에서 가져온 텍스트와 함께 이미지 레이아웃에 넣어줍니다.

'Java' 카테고리의 다른 글

[android] Activity 구현 팁  (1) 2018.02.03
[android] 경과한 시간에 따른 날짜 표현 방식  (0) 2018.02.03
[android] 구글맵 3  (0) 2018.02.03
[android] 구글맵 2  (0) 2018.02.03
[android] 구글맵 1  (0) 2018.02.03

이번엔 구글맵 자체를 클릭했을 때 좌표를 얻는 방법을 구현해보겠습니다.


1. setOnMapClickListener 사용


        googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() 
            }
        });
    }
cs


이렇게 onMapClickListener()를 설정합니다. onMapClickListener의 안에서 여러가지를 구현할 수 있습니다.


            @Override
            public void onMapClick(LatLng point) {
                ReferSharedPreference preferenceCoordinates = new ReferSharedPreference(getContext());
                MarkerOptions marker = new MarkerOptions().position(
                        new LatLng(point.latitude, point.longitude)).title("ok");
                preferenceCoordinates.put("Coor""{ \"longitude\": \""+point.latitude +"\",     \"latitude\": \""+point.longitude+"\" } ");
                preferenceCoordinates.put("Lat"String.valueOf(point.latitude));
                preferenceCoordinates.put("Lon"String.valueOf(point.longitude));

cs


지도의 좌표를 가져올 수 있습니다.


                googleMap.clear();
                googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point, 14));
                googleMap.addMarker(marker);
cs


이걸로 애니메이션을 구현합니다. 카메라 줌도 바꿀 수 있으며 마커도 새로 추가할 수 있습니다.


                String lat = preferenceCoordinates.getValue("Lat", "13");
                String lon = preferenceCoordinates.getValue("Lon", "15");
                mCoordinatesTextMap.setText(lat + "  , " + lon);
cs


이렇게 하여 (13,15)를 기본으로 하는 부분을 구현했습니다. 값이 없을 경우에 지정된 값을 불러옵니다.

지난 시간의 코드와 연결됩니다.


2. 참고 코드


                ReferSharedPreference preferenceCoordinates = new ReferSharedPreference(getContext());
                LatLng point = new LatLng(googleMap.getMyLocation().getLatitude(), googleMap.getMyLocation().getLongitude());
                MarkerOptions marker = new MarkerOptions()
                        .position(point).title("ok");
cs


이 부분과의 접점이 있었습니다. 좌표값을 SharedPreference에 저장해 놓거나 새로 저장해서 사용하도록 합니다. 전 ReferSharedPreference라는 새로운 dataType을 만들어서 사용했습니다. 

'Java' 카테고리의 다른 글

[android] 경과한 시간에 따른 날짜 표현 방식  (0) 2018.02.03
[android] Glide와 intent 사용하기  (0) 2018.02.03
[android] 구글맵 2  (0) 2018.02.03
[android] 구글맵 1  (0) 2018.02.03
[android] Fragment 만들기 2-2  (0) 2018.02.03

1. 준비물


먼저 import 해야할 것이 있습니다.


import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
cs


이렇게 해야 좌표를 찍을 수 있습니다. 이걸로 좌표정보인 위도와 경도, 그리고 마커를 조작할 수 있게 됩니다.


2. 코드 구현


좌표를 얻는 코드를 구현하겠습니다.


        googleMap.setOnMyLocationButtonClickListener(new GoogleMap.OnMyLocationButtonClickListener() {
            @Override
            public boolean onMyLocationButtonClick() {
                ReferSharedPreference preferenceCoordinates = new ReferSharedPreference(getContext());
                LatLng point = new LatLng(googleMap.getMyLocation().getLatitude(), googleMap.getMyLocation().getLongitude());
                MarkerOptions marker = new MarkerOptions()
                        .position(point).title("ok");
                preferenceCoordinates.put("Coor", "{ \"longitude\": \""+ googleMap.getMyLocation().getLatitude() +"\",     \"latitude\": \""+ googleMap.getMyLocation().getLongitude() +"\" } ");
                preferenceCoordinates.put("Lat", String.valueOf(googleMap.getMyLocation().getLatitude()));
                preferenceCoordinates.put("Lon", String.valueOf(googleMap.getMyLocation().getLongitude()));
                googleMap.clear();
                googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point, 14));
                googleMap.addMarker(marker);
                String lat = preferenceCoordinates.getValue("Lat", "13");
                String lon = preferenceCoordinates.getValue("Lon", "15");
                mCoordinatesTextMap.setText(lat + "  , " + lon);
                return true;
            }
        });
cs


이렇게 하면 기본으론 (13, 15) 좌표를 갖는 좌표클릭을 구현하게 되었습니다. 경도와 위도가 바뀌지 않도록 유의합니다.

위에서 변수 지정은 잊지 말아야 합니다. 변수 지정이 조금이라도 잘 못 되면 전체 정보가 왜곡되기 때문입니다.

ReferSharedPreference preferenceCoordinates 는 따로 지정한 DataType 이므로 나중에 다시 지정해야 합니다.


private TextView mCoordinatesTextMap;
cs


이렇게 하면 좌표를 지정할 레이아웃을 가져옵니다.

'Java' 카테고리의 다른 글

[android] Glide와 intent 사용하기  (0) 2018.02.03
[android] 구글맵 3  (0) 2018.02.03
[android] 구글맵 1  (0) 2018.02.03
[android] Fragment 만들기 2-2  (0) 2018.02.03
[android] Fragment 만들기 2-1  (0) 2018.02.03

1. 준비물

구글맵을 넣기 위해선 Activity 에서 해줘야 할 작업이 있습니다. 구글맵은 com.google.android.gms.maps.GoogleMap; 의 형태로 지원됩니다.

 

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
cs


그 후 작업을 하면 됩니다. 이 경우에도 변수에 유의해야 합니다.

 

public class BlueFragment extends Fragment implements OnMapReadyCallback {
 
    public GoogleMap googleMap;
}
cs


이렇게 구글맵을 따로 잡아줘야 합니다. GoogleMap이라는 변수를 사용했습니다.

레이아웃을 불러오겠습니다.


2. 레이아웃 불러오기



    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 
        View view = inflater.inflate(R.layout.fragment_blue, container, false);
        MapView mapview = (MapView) view.findViewById(R.id.map_blue);
        mapview.onCreate(savedInstanceState);
        mapview.onResume();
        mapview.getMapAsync(this);
 
        mCoordinatesTextMap = (TextView) view.findViewById(R.id.tv_coordinates_map);
 
        return view;
    }
 
cs


이렇게 onCreateView를 구현합니다. 단순히 mapview를 view.findViewById로 가져오는 것이 아닙니다. 

인자로 R.layout.fragment_blue, container, false를 사용했다는 것을 명심해야 합니다.


3. 구글맵 사용자 권한 설정


    @Override
    public void onMapReady(final GoogleMap googleMap) {
 
        int permissionCheck = ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.READ_EXTERNAL_STORAGE);
 
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            googleMap.setMyLocationEnabled(true);
        } else {
            ActivityCompat.requestPermissions(getActivity(),
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    2000);
        }
}
cs


권한 획득을 하는 곳까지 구현했습니다.

구글맵 사용시 위치정보 사용권한을 사용자에게 묻는 코드입니다. 더 궁금하다면 Manifest.permission.READ_EXTERNAL_STORAGE에서 추가 내용을 확인합니다.

'Java' 카테고리의 다른 글

[android] 구글맵 3  (0) 2018.02.03
[android] 구글맵 2  (0) 2018.02.03
[android] Fragment 만들기 2-2  (0) 2018.02.03
[android] Fragment 만들기 2-1  (0) 2018.02.03
[android] Fragment 만들기1  (0) 2018.02.03

1. 목표


이번엔 단순하게 onClickListener를 이용해서 구현해보도록 하겠습니다.


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
public class MainActivity extends FragmentActivity {
 
    private ImageView btn_red;
    private ImageView btn_blue;
    private ImageView btn_yellow;
    private ImageView btn_green;
 
    private ViewPager vp_pager;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        vp_pager = (ViewPager) findViewById(R.id.vp_pager);
 
        Fragment[] arrFragmnets = new Fragment[4];
        arrFragmnets[0= new YellowFragment();
        arrFragmnets[1= new RedFragment();
        arrFragmnets[2= new GreenFragment();
        arrFragmnets[3= new BlueFragment();
 
        MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), arrFragmnets);
        vp_pager.setOffscreenPageLimit(4);
        vp_pager.setAdapter(adapter);
 
 
        btn_blue = (ImageView) findViewById(R.id.btn_blue);
        btn_red = (ImageView) findViewById(R.id.btn_red);
        btn_yellow = (ImageView) findViewById(R.id.btn_yellow);
        btn_green = (ImageView) findViewById(R.id.btn_green);
 
        btn_yellow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                vp_pager.setCurrentItem(0);
            }
        });
        btn_red.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                vp_pager.setCurrentItem(1);
            }
        });
        btn_green.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                vp_pager.setCurrentItem(2);
            }
        });
        btn_blue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                vp_pager.setCurrentItem(3);
            }
        });
       
        // 여기서 setCurrentItem()가 pager에 연결되어 사용되었다.
    }
}
cs



이렇게 하게되면 굳이 switch()구문을 이용하지 않아도 구현이 가능합니다. 대신에 arrFragment[] array를 주의해야 합니다.

위의 코드는 자연스럽게 setOnClickListener()를 쓰기 때문에 기본적인 기술만으로 구현이 가능하다는 장점이 있습니다.

하지만 일일이 다 만들어줘야 하기 때문에 Fragment가 많아지면 복잡해진다는 단점이 있습니다. Fragment를 사용할 땐 pager가 잘 쓰입니다. pager는 setCurrentItem() 함수와 같이 현재 Fragment의 정보를 불러오는 기능을 가능하게 해줍니다. Fragment의 정보를 일종의 page처럼 다룹니다.


추가로 레이아웃에선 이런 코드가 있을 수 있습니다.


2. 레이아웃 예시


    <fragment
        android:id="@+id/fragment_row"
    android:layout_weight="9"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:name="com.example.keepair.myapplication.RowFragment"
    tools:layout="@layout/fragment_row"></fragment>
cs

이 코드는 fragment의 레이아웃을 지정하는 코드입니다. weight가 9로 설정되어 있음을 확인할 수 있습니다. 그리고 fragment에도 id 값을 부여할 수 있습니다. 


다음에 이어서 올리겠습니다.


'Java' 카테고리의 다른 글

[android] 구글맵 3  (0) 2018.02.03
[android] 구글맵 2  (0) 2018.02.03
[android] 구글맵 1  (0) 2018.02.03
[android] Fragment 만들기 2-1  (0) 2018.02.03
[android] Fragment 만들기1  (0) 2018.02.03


1. onColorClick과 switch()를 이용한 구성


그 다음엔 switch 를 이용하여 fragment간 이동을 가능하게 하는 onclicklistener 를 구현해 보겠습니다.

첫 번째 방법입니다.


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
    Fragment frag_red;
    Fragment frag_blue;
    Fragment frag_green;
    Fragment frag_yellow;
    //    Fragment fragment = new Fragment();
    //color  0 red 1 blue 2green 3 yellow
    @Override
    public void onColorClick(int color) {
        Fragment frag = null;
        switch (color) {
            case 0:
                frag_red = getSupportFragmentManager().findFragmentByTag("red");
                frag = frag_red;
                if(frag_red==null){
                    frag_red=new RedFragment();
                    getSupportFragmentManager().beginTransaction().add(R.id.fragment_ex, frag_red, "red").commit();
                }
                break;
            case 1:
                frag_blue = getSupportFragmentManager().findFragmentByTag("blue");
                frag = frag_blue;
                if(frag_blue==null){
                    frag_blue=new BlueFragment();
                    getSupportFragmentManager().beginTransaction().add(R.id.fragment_ex, frag_blue, "blue").commit();
                }
                break;
            case 2:
                frag_green = getSupportFragmentManager().findFragmentByTag("green");
                frag = frag_green;
                if(frag_green==null){
                    frag_green=new GreenFragment();
                    getSupportFragmentManager().beginTransaction().add(R.id.fragment_ex, frag_green, "green").commit();
                }
                break;
            case 3:
                frag = frag_yellow;
                frag_yellow = getSupportFragmentManager().findFragmentByTag("yellow");
                if(frag_yellow==null){
                    frag_yellow=new YellowFragment();
                    getSupportFragmentManager().beginTransaction().add(R.id.fragment_ex, frag_yellow, "yellow").commit();
                }
                break;
        }
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_ex, frag)
                .addToBackStack(null)
                .commit();
    }
 
cs


이렇게 구현하면 바로 commit()를 해줄 수 있는 장점이 있습니다. 그러나 언급되지 않은 getSupportFragmentManager()가 사용되었습니다.

그것은 여기서 가져오면 됩니다. 사용될 프래그먼트들을 태그를 통해 가져오고 그 값을 통해 if문과 case문을 결합하여 beginTransaction() 을 호출합니다. 


2. 준비물

1
2
3
4
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
cs


여기서 getSupportFragmentManager()가 사용되게 됩니다. 이 부분을 잊으면 진행에 문제가 되니 주의해야 합니다. Fragment를 이용하기 위해선 Activity, Manager, Transaction 모두를 다 불러와야 합니다.

다음엔 다른 방법을 알아보겠습니다.

'Java' 카테고리의 다른 글

[android] 구글맵 3  (0) 2018.02.03
[android] 구글맵 2  (0) 2018.02.03
[android] 구글맵 1  (0) 2018.02.03
[android] Fragment 만들기 2-2  (0) 2018.02.03
[android] Fragment 만들기1  (0) 2018.02.03

+ Recent posts