안녕하세요.

ScrollView로 페이지 처리할때 필요한 Custom 클래스공유해드려요.

 

안드로이드 ListView에서 페이지 처리할 때 꼭 필요한게 setOnScrollListener()인데요.

왜냐하면 스크롤이 화면 맨 바닥에 감지했을때 이벤트 처리를해야 하기 때문이죠

 

ScrollView에서는  setOnScrollListener() 이게 없습니다.

Custom클래스 이용하여 페이징 처리할 수 있는 방법에 대해 설명하겠습니다.

 

우선 클래스부터 추가합니다. 아래소스로 클래스 생성해주세요.

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;

public class CustomScrollView extends ScrollView {

    private ScrollViewListener scrollViewListener = null;

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

    public CustomScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CustomScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
        }
    }
}

 

 

[사용방법]

 

-Xml 파일

<com.custom.scrollview.view.CustomScrollView      -> 자신의 패키지명을 적어주세요
        android:id="@+id/sv_store_history"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true" >

<내용>

</com.custom.scrollview.view.CustomScrollView>

 

-사용할 클래스 파일

private CustomScrollView svStoreHistory;

svStoreHistory = (CustomScrollView)findViewById(R.id.sv_store_history);

svStoreHistory.setScrollViewListener(new ScrollViewListener() {

            @Override
            public void onScrollChanged(CustomScrollView scrollView, int x, int y, int oldx, int oldy) {
                View view = scrollView.getChildAt(scrollView.getChildCount() - 1);
                int diff = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY()));

                if (diff == 0 && mLockScrollView == false) { // 스크롤 bottom
                    
                }
            }
        });        

if문안에 페이징 처리나 바닥에 닿았을때 처리하고 싶은 이벤트 코드 작성해 주시면됩니다.

 

 

댓글을 달아 주세요

  • 김병희 2016.06.10 18:07  댓글주소  수정/삭제  댓글쓰기

    안드로이드 관련 글목록 보다가 생각나서 질문을 하나 드립니다.
    에디트텍스트 스크롤 빠르게 하려고 스크롤뷰에 넣어서 돌리다가 터치이벤트 가로채는 문제를 해결하지 못하여 포기하고 에디트만 돌리고 있습니다.
    터치이벤트의 상하 드래그 간격을 여러 배수로 스크롤시켜 어느 정도 구현은 했는데, 자연스러운 스크롤이 많이 부족합니다.

    혹시 스크롤뷰에 담으면서 에디트의 터치이벤트 및 포지션 계산 등에 아무 지장이 없게 하는 방법이 있을까요?
    도움 주신다면 정말로 감사하겠습니다.
    앱 배포 시점이 되면 상업적인 코드제작소에 의뢰할까도 생각해보았던 문제입니다.

    친절하게 답변 주시는 분들도 몇 분 있지만 그분들의 사정을 알지 못하므로 용기를 내지 못했습니다.
    그런데 님의 글을 보고, 이 페이지에 와서는 감히 용기를 내어 질문합니다.

    읽어주시는 것만 해도 감사합니다.

    • Heum Heum's 2016.06.13 09:37 신고  댓글주소  수정/삭제

      ListView에 버튼 클릭할 때 터치이벤트 문제 발생해서
      android:focusable="false"
      사용해서 문제 해결한 기억이 있네요
      scrollview와 editText 두개 다 적용 한번 해보세요.
      도움이 될지는 모르겠네요 ㅜㅜ

  • 김병희 2016.06.17 13:33  댓글주소  수정/삭제  댓글쓰기

    답변 감사합니다.
    테스트해 보겠습니다.

 

이클립스 프로젝트를 안드로이드 스튜디오로 import할 때

Error:(1,0) Plugin with id'com.android.application' not found

위와같은 에러 메시지가 발생할 때 해결방안입니다.

 

 

Gradle Scripts -> build.gradle

 

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
}
apply plugin: 'com.android.application'

apply plugin: 'com.android.application'  --> 이 Line 위에 코드 전부 붙여 넣어주세요

 

저같은 경우는 import 했을때 buildscript{}부분이 생성되지 않아 추가해주니 에러 사라지고 정상적으로 실행되었습니다.

 

 

댓글을 달아 주세요

 

자바 코드상에서 단말기(폰)에 해상도를 구하는 방법입니다.

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

Toast.makeText(getApplicationContext(),"해상도: " + dm.widthPixels + "x" + dm.heightPixels,Toast.LENGTH_SHORT).show();

 

해상도별 작업할때 유용합니다.

 

댓글을 달아 주세요

 

 

안드로이드 멀티터치 기능을 막는 방법 2가지를 알아보겠습니다.

 

1. Xml

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:splitMotionEvents="false"
        android:orientation="horizontal" >

버튼 or 터치 or 클릭 기능을 담고 있는 뷰의 레이아웃에 android:splitMotionEvents="false" 를 적용해주세요.

 

 

2. values -> styles.xml

<style name="splitTheme" parent="@android:style/Theme.NoTitleBar">
    <!-- 멀티터치 막기 -->
    <item name="android:splitMotionEvents">false</item> 
</style>

 AndroidManifest.xml

<application
    android:theme="@style/splitTheme" >
</application>

styles.xml에 위와 같이 테마를 적용해주시고. AndroidManifest에 명시 해줍니다.

 

 

1번은 레이아웃 별로 나누어서 멀티터치 기능을 막고싶을때 사용하고, 2번은 App 전체에 멀티터치 기능을 막을때 사용하면 됩니다.

 

 

댓글을 달아 주세요

 

이미지뷰를 사용할 때 MATCH_PARENT를 적용을 해줘도 이미지가 X,Y축으로 늘어나지 않을경우가 있는데요

 

자바 코드에서 적용할 경우

imageView.setScaleType(ScaleType.FIT_XY);

 

Xml에서 적용할 경우

<ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY" />

 

적용해 주시면 잘됩니다.

 

 

댓글을 달아 주세요

 

 

안드로이드 Toast 메시지를 자주 사용하는데요.

Toast의 글씨를 TextView 형태로 사용할 수 있습니다. 

TextView 형태로 사용함으로써 Toast 메시지의 글자 크기,색,백그라운드 배경 등을 변경할 수 있습니다.

 

아래 메소드 참고해주세요.

 

 /**
     * 토스트 설정
     */
    public static void setCustomToast(Context context, String msg) {
        TextView tvToastMsg = new TextView(context);
        tvToastMsg.setText(msg);
        tvToastMsg.setBackgroundResource(R.drawable.bt_tag);
        tvToastMsg.setTextColor(Color.RED);
        tvToastMsg.setTextSize(16);

        final Toast toastMsg = Toast.makeText(context, "", Toast.LENGTH_SHORT);
        toastMsg.setView(tvToastMsg);

        toastMsg.show();
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                toastMsg.cancel();
            }
        }, 1000);
    }

 

그리고 Toast 사용할 때 시간을 설정하는데 Toast.LENGTH_SHORT 보다 시간을 짧게 설정하고 싶을 때

Handler로 Delay를 주고 Toast를 종료시키는 방법이 있습니다.

 

 

결과화면

 


 


 

 

 

 

댓글을 달아 주세요

안녕하세요.

EditText를 사용할 때 키보드를 내려야할 경우가 종종 있습니다. 

예를들어 Fragment 화면 전환할 경우 EditText 키보드가 저절로 안내려가죠..

아래 메소드 참고하세요

 

public static void downKeyboard(Context context, EditText editText) {
    InputMethodManager mInputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
    mInputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}

댓글을 달아 주세요

안녕하세요.

안드로이드 이미지뷰 작업할 경우 dim처리 또는 이미지뷰의 이미지만 컬러를 변경하고 싶을 경우 

쉽게 변경할 수 있는 방법이 있습니다.

저도 좀 헤메다가 간단하게 처리할 수 있는 방법을 찾았습니다.

 

ImageView iv = (ImageView)findViewById(R.id.iv);
iv.setColorFilter(R.color.color_88000000);

dim처리 반투명처리를 하고 싶으시면 Color 부분에 #88000000을 적용해 주세요.

 

 

xml 파일에서 코드작성할때 유의 해주세요.

<ImageView 
       android:id="@+id/iv"
       android:layout_width="200dp"
       android:layout_height="200dp"
       android:src="@drawable/ic_launcher"/>

 

android:background -> 이거 사용하면 적용이 안돼요, android:src를 써주세요 

 

 

결과화면

 

 

 

 

 

 

댓글을 달아 주세요

안녕하세요.

페이스북 4.x 버전 SDK 적용하고 페이스북 로그인 연동하는 방법에 대해 포스팅 하겠습니다.

이전 버전 SDK 적용시 페이스북 앱이 설치되어 있는 경우 제대로 정보를 가져오지 못하는 오류가 있었는데 

저는 최신 버전 SDK 적용 후 이 문제를 해결했네요.

 

 

기본적으로 developers.facebook에 페이스북과 연동할 앱 등록하시고 App ID는 가지고 있으셔야합니다.

AndroidManifest.xml에 App ID를 등록 해줘야 하거든요.

페이스북에 앱 등록하는 부분은 검색하면 많이 있습니다

 

 

1.

아래 링크에서 4 버전에 SDK 다운 받아주세요.

https://developers.facebook.com/docs/android/downloads

 

 

2.

SDK 압축 푸시고 프로젝트 Import 후 bolts 라이브러리 추가해주세요

bolts-android-1.2.1.jar
다운로드

 

 

3. 

AndroidManifest.xml 

       <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="app_id" />

        <activity
            android:name="com.facebook.FacebookActivity"/>

App ID 와 FacebookActivity 등록해주세요. App ID는 자신이 생성한 아이디 적으세요

FacebooActivity 제가 작업하는 Activity가 아닌 연동 시 자동으로 뜨는 Activity입니다.

 

 

4.

Activity 작성

import java.util.Arrays;

import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.corfire.stampy.utils.PreferenceUtil;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphRequest.GraphJSONObjectCallback;
import com.facebook.GraphResponse;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;


public class FacebookTestActivity extends Activity {

    private CallbackManager callbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();

            LoginManager.getInstance().logInWithReadPermissions(FacebookTestActivity.this,
                                                                Arrays.asList("public_profile", "email"));
            LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {

                @Override
                public void onSuccess(final LoginResult result) {

                    GraphRequest request;
                    request = GraphRequest.newMeRequest(result.getAccessToken(), new GraphJSONObjectCallback() {

                        @Override
                        public void onCompleted(JSONObject user, GraphResponse response) {
                            if (response.getError() != null) {

                            } else {
                                Log.i("TAG", "user: " + user.toString());
                                Log.i("TAG", "AccessToken: " + result.getAccessToken().getToken());
                                setResult(RESULT_OK);
                                finish();
                            }
                        }
                    });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,name,email,gender,birthday");
                    request.setParameters(parameters);
                    request.executeAsync();
                }

                @Override
                public void onError(FacebookException error) {
                    Log.e("test", "Error: " + error);
                    finish();
                }

                @Override
                public void onCancel() {
                    finish();
                }
            });
        
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

 

이전 버전에서는 Session 객체를 통해서 페이스북 로그인 연동 작업이 이루어 졌는데

지금은 LoginManager 객체를 사용하네요.

 

 

위와 같이 작성하고 프로젝트 실행해 보면 Log에서 사용자 정보와 Token 값을 가져옵니다.

실행하다 보면 Key Hashes 문제로 에러로그 나타나는데 로그에 찍힌 해쉬키 값을 

페이스북 디벨로퍼에 등록해주면 정상적으로 사용자 정보 가져옵니다. 

 

 

추가로 페이스북 연동 로그아웃 방법입니다.

LoginManager.getInstance().logOut();

댓글을 달아 주세요

  • 영상털이범 2016.03.18 13:11 신고  댓글주소  수정/삭제  댓글쓰기

    페이스북 SDK 4.5.1 혹은 4.6.0이후로 방법이 바뀐것 같습니다.
    (4.10.0 버전기준으로 작업하였으며, 4.7.0 부터 해당방법으로 진행해야 되는것 같음)
    SDK 압축파일 다운로드 후, 압축을 해제합니다.
    facebook 폴더가 있을텐데 해당 폴더에 .aar 파일이 있습니다.
    1. facebook-android-sdk-4.x.x.arr 파일을 facebook-android-sdk-4.x.x.zip 파일로 변환합니다.
    2. facebook-android-sdk-4.x.x.zip 파일의 압축을 해제합니다.
    3. 압축을 해제한 폴더에 classes.jar 파일을 원하는 이름으로 변경 후 사용하시면 됩니다.
    (ex. classes.jar -> facebook-android-sdk-4.x.x.jar)

    이전에 라이브러리 프로젝트 추가해서 사용하는 방법 대신에 jar 파일 추가해서 사용하시면 됩니다.

  • 빵그레 2016.07.22 17:37 신고  댓글주소  수정/삭제  댓글쓰기

    소스코드 참고했어요. 감사합니다:)

안녕하세요.

안드로이드 상태바 (Status Bar) 컬러를 자바 코드상에서 변경하는 방법입니다. 

 

libs 폴더에 라이브러리 추가해주세요.

 

android-support-v4.jar
다운로드

 

android-support-v7-appcompat.jar
다운로드

 

 

Activity의 onCreate 메소드 안에 자바 코드로 작성하시면 됩니다.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setStatusBarColor(Color.RED);

 

결과 화면

 

 

댓글을 달아 주세요

안녕하세요.

라이브러리를 사용하지 않고 네비게이션 드로어를 사용하여 슬라이드 메뉴를 구현해보겠습니다.

 

먼저 libs 폴더에 android-support-v4.jar 폴더를 추가 합니다.

 

activity_slide_menu.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/dl_activity_main_drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/fl_activity_main_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="40dp" />
    </FrameLayout>

    <ListView
        android:id="@+id/lv_activity_main_nav_list"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#EDEDED"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />

</android.support.v4.widget.DrawerLayout>

 

SlideMenuActiviy.java

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.Toast;

/**
 * 네비게이션 드로어 적용
 * 
 * @author
 * @version
 * @since
 * @created 2015. 9. 24.
 */
public class SlideMenuActivity extends Activity {

    private final String[] navItems = {"Brown", "Cadet Blue", "Dark Olive Green", "Dark Orange", "Golden Rod"};

    private ListView lvNavList;

    private FrameLayout flContainer;

    private DrawerLayout dlDrawer;

    private Button btn;

    @Override
    public void onBackPressed() {
        if (dlDrawer.isDrawerOpen(lvNavList)) {
            dlDrawer.closeDrawer(lvNavList);
        } else {
            super.onBackPressed();
        }
    }

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

        lvNavList = (ListView)findViewById(R.id.lv_activity_main_nav_list);
        flContainer = (FrameLayout)findViewById(R.id.fl_activity_main_container);
        btn = (Button)findViewById(R.id.btn);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "open", Toast.LENGTH_SHORT).show();
                dlDrawer.openDrawer(lvNavList);
            }
        });

        dlDrawer = (DrawerLayout)findViewById(R.id.dl_activity_main_drawer);

        lvNavList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, navItems));
        lvNavList.setOnItemClickListener(new DrawerItemClickListener());
    }

    private class DrawerItemClickListener implements ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
            switch (position) {
                case 0:
                    flContainer.setBackgroundColor(Color.parseColor("#A52A2A"));
                    break;
                case 1:
                    flContainer.setBackgroundColor(Color.parseColor("#5F9EA0"));
                    break;
                case 2:
                    flContainer.setBackgroundColor(Color.parseColor("#556B2F"));
                    break;
                case 3:
                    flContainer.setBackgroundColor(Color.parseColor("#FF8C00"));
                    break;
                case 4:
                    flContainer.setBackgroundColor(Color.parseColor("#DAA520"));
                    break;
            }
            dlDrawer.closeDrawer(lvNavList);

        }
    }

}

 

버튼 클릭 or 옆으로 슬라이드시 화면이 나오고 back key 눌렀을 경우 슬라이드 메뉴가 사라지는 부분까지 적용했습니다. 위와 같이 사용하면 별도로 슬라이드 메뉴 라이브러리를 적용 시키지 않고도 간단하게 슬라이드 메뉴를 사용할 수 있습니다.

 

 

결과화면


 

 

댓글을 달아 주세요

  • 김병희 2016.09.07 10:43  댓글주소  수정/삭제  댓글쓰기

    초간단, 마음에 듭니다.
    잠깐 테스트해 보니 믿음이 가는군요.
    잘 쓰겠습니다.
    감사합니다.

  • 도와주세요 2016.12.12 04:58  댓글주소  수정/삭제  댓글쓰기

    <menu>
    <item
    ....
    />
    </menu>
    이 것은 프로젝트 만들때 네비게이션으로 만든것입니다.
    activity_main_drawer.xml에서 위에 보는 바와 같이 <menu>를 써주면 클릭했을때 배경색이 안나오더라구요.
    그냥 실행해서 클릭하면 배경색이 나오고..
    menu를 써줘도 색깔이 나오게 하려면 어딜 건드려야 하는지 모르겠습니다.
    도와주세요

    • Heum Heum's 2016.12.12 15:31 신고  댓글주소  수정/삭제

      onMenuItemSelected() --> 메뉴 클릭했을 때 이벤트 가져오는 메소드
      flContainer.setBackgroundColor(Color.parseColor("#A52A2A")); --> 배경색 바꾸는 코드
      저 메소드 찾아서 공부해보시고 그 안에
      배경색 바꾸는 코드 넣으면 될거같네요.

      아래 사이트 참고해보세요.
      http://itmir.tistory.com/409

사용자 폰에 설정되어있는 언어 가져오는 코드입니다.

//폰에 설정되어 있는 언어 값 추출
Locale locale = getResources().getConfiguration().locale;
String language = locale.getLanguage();

댓글을 달아 주세요

 

이미지 url로 이미지를 다운받아 폴더에 저장하고 저장한 이미지를 갤러리를 통해 여는 방법에 대해 알아보겠습니다.

 

1. 먼저 퍼미션 설정 부터 합니다.

 AndroidManifest.xml

<!-- 인터넷 접속 -->
<uses-permission android:name="android.permission.INTERNET" />
    
<!-- 파일 생성,삭제 하기 위한 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

2. 자바 코드를 작성합니다.

 MainActivity.java

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;


public class MainActivity extends Activity {

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

        String imgUrl = "http://img.naver.net/static/www/u/2013/0731/nmms_224940510.gif";
        new ImageDownload().execute(imgUrl);
    }

    /**
     * url 이미지 다운로드
     * 
     */
    private class ImageDownload extends AsyncTask<String, Void, Void> {

        /**
         * 파일명
         */
        private String fileName;

        /**
         * 저장할 폴더
         */
        private final String SAVE_FOLDER = "/save_folder";

        @Override
        protected Void doInBackground(String... params) {

            //다운로드 경로를 지정
            String savePath = Environment.getExternalStorageDirectory().toString() + SAVE_FOLDER;

            File dir = new File(savePath);

            //상위 디렉토리가 존재하지 않을 경우 생성
            if (!dir.exists()) {
                dir.mkdirs();
            }

            //파일 이름 :날짜_시간
            Date day = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.KOREA);
            fileName = String.valueOf(sdf.format(day));

            //웹 서버 쪽 파일이 있는 경로
            String fileUrl = params[0];

            //다운로드 폴더에 동일한 파일명이 존재하는지 확인
            if (new File(savePath + "/" + fileName).exists() == false) {
            } else {
            }

            String localPath = savePath + "/" + fileName + ".jpg";

            try {
                URL imgUrl = new URL(fileUrl);
                //서버와 접속하는 클라이언트 객체 생성
                HttpURLConnection conn = (HttpURLConnection)imgUrl.openConnection();
                int len = conn.getContentLength();
                byte[] tmpByte = new byte[len];
                //입력 스트림을 구한다
                InputStream is = conn.getInputStream();
                File file = new File(localPath);
                //파일 저장 스트림 생성
                FileOutputStream fos = new FileOutputStream(file);
                int read;
                //입력 스트림을 파일로 저장
                for (;;) {
                    read = is.read(tmpByte);
                    if (read <= 0) {
                        break;
                    }
                    fos.write(tmpByte, 0, read); //file 생성
                }
                is.close();
                fos.close();
                conn.disconnect();
            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            //저장한 이미지 열기
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            String targetDir = Environment.getExternalStorageDirectory().toString() + SAVE_FOLDER;
            File file = new File(targetDir + "/" + fileName + ".jpg");
            //type 지정 (이미지)
            i.setDataAndType(Uri.fromFile(file), "image/*");
            getApplicationContext().startActivity(i);
            //이미지 스캔해서 갤러리 업데이트
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
        }
    }

}

 

결과화면

 

앱을 실행하면 폴더에 자동으로 저장되고 저장한 이미지를 갤러리에서 바로 열어줍니다.

 

 

 

 

댓글을 달아 주세요

 

원하는 번호로 바로 통화 거는 방법

 

먼저 메니페스트에 퍼미션 설정을 해줍니다.

 

AndroidManifest.xml

<!-- 전화걸기 -->
 <uses-permission android:name="android.permission.CALL_PHONE" />

 

자바코드

String telNo = "010-0000-0000";
Intent call = new Intent(Intent.ACTION_CALL, Uri.parse("tel:/" + telNo));
startActivity(call);

 

댓글을 달아 주세요

 

안드로이드에서 제공하는 AlertDialog 사용법에 대해 알아보겠습니다.

간단하게 사용하여 alert창과 confirm창에 적용할 수 있습니다.

 

Alert창 적용

 

AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Error");
alert.setMessage("에러가 발생 하였습니다.");
alert.setPositiveButton("확인", new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
});

alert.show();

 

 

 

 

 

 

 

Confirm창 적용

 

AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("삭제");
alert.setMessage("정말로 삭제 하시겠습니까?");

alert.setPositiveButton("확인", new OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
     }
     });

alert.setNegativeButton("취소", new OnClickListener() {
     @Override
     public void onClick(DialogInterface arg0, int arg1) {
      }
     });

alert.show();

 

 

확인,취소 버튼의 이벤트는 onClick 메소드안에서 처리하시면 됩니다.

 

Material Design Dialog (롤리팝 다이얼로그)를 사용하시고 싶으시면 import android.support.v7.app.AlertDialog;를 사용하시면 됩니다.

이클립스에서 사용하려면 lib폴더에 support-v7 라이브러리 추가하시면 되고 안드로이드 스튜디오라면 gradle에 dependencies 추가해주시면 됩니다. 

 

롤리팝 다이얼로그 적용화면 (Android Material Dialog)


 

 

 

댓글을 달아 주세요

 

안녕하세요.

안드로이드 개발할 때 Lg폰에 소프트키를 유무를 확인해야 할 경우가 종종 있는데요.

간단하게 확인할 수 있는 방법이 있습니다.

 

    /**
     * Lg 폰 일 경우 Dp 값 조정
     */
    private void checkLgPhone() {
        //메뉴버튼 유무
        boolean hasMenuKey = ViewConfiguration.get(getApplicationContext()).hasPermanentMenuKey();
        //뒤로가기 버튼 유무
        boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);

        if (!hasMenuKey && !hasBackKey) { // lg폰 소프트키일 경우
            Log.i("phoneType", "LGphone");

        } else { // 삼성폰 등.. 메뉴 버튼, 뒤로가기 버튼 존재 
            Log.i("phoneType", "Not LGphone");
        }

    }

 

if,else문에서 상황에 따라 처리 할 수 있습니다. 

 

 

댓글을 달아 주세요

 

안녕하세요.

GridView로 간단한 달력을 만들어 보겠습니다.

 

1. 먼저 레이아웃부터 만들겠습니다.

- 현재 연/월을 보여줄 텍스트뷰와 Calendar를 작성할 그리드뷰를 사용합니다.

 

res->layout

activity_calendar.xml      (@color/color_ffffff를 사용하시려면 color.xml에 작업해주세요.)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/color_ffffff" >

    <TextView
        android:id="@+id/tv_date"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/color_21a4ff"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:textColor="@color/color_ffffff"
        android:textSize="20sp" />
    
    <GridView
        android:layout_marginTop="10dp"
        android:id="@+id/gridview"
        android:layout_weight="1"
        android:layout_height="0dp" 
        android:layout_width="match_parent"
        android:numColumns="7"
        android:listSelector="@color/transparent"
        >
    </GridView>

</LinearLayout>

 

item_calendar_gridview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:gravity="center">
    
    <TextView 
        android:gravity="center_horizontal"
        android:id="@+id/tv_item_gridview"
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="20sp"
        />
    
</LinearLayout>

 

2. 다음은 자바코드를 작성하겠습니다.

CalendarActivity.java

package com.example.calendar;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView;

public class CalendarActivity extends Activity {

    /**
     * 연/월 텍스트뷰
     */
    private TextView tvDate;
    /**
     * 그리드뷰 어댑터
     */
    private GridAdapter gridAdapter;

    /**
     * 일 저장 할 리스트
     */
    private ArrayList<String> dayList;

    /**
     * 그리드뷰
     */
    private GridView gridView;

    /**
     * 캘린더 변수
     */
    private Calendar mCal;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_calendar);

        tvDate = (TextView)findViewById(R.id.tv_date);
        gridView = (GridView)findViewById(R.id.gridview);

        // 오늘에 날짜를 세팅 해준다.
        long now = System.currentTimeMillis();
        final Date date = new Date(now);
        //연,월,일을 따로 저장
        final SimpleDateFormat curYearFormat = new SimpleDateFormat("yyyy", Locale.KOREA);
        final SimpleDateFormat curMonthFormat = new SimpleDateFormat("MM", Locale.KOREA);
        final SimpleDateFormat curDayFormat = new SimpleDateFormat("dd", Locale.KOREA);

        //현재 날짜 텍스트뷰에 뿌려줌
        tvDate.setText(curYearFormat.format(date) + "/" + curMonthFormat.format(date));

        //gridview 요일 표시
        dayList = new ArrayList<String>();
        dayList.add("일");
        dayList.add("월");
        dayList.add("화");
        dayList.add("수");
        dayList.add("목");
        dayList.add("금");
        dayList.add("토");

        mCal = Calendar.getInstance();

        //이번달 1일 무슨요일인지 판단 mCal.set(Year,Month,Day)
        mCal.set(Integer.parseInt(curYearFormat.format(date)), Integer.parseInt(curMonthFormat.format(date)) - 1, 1);
        int dayNum = mCal.get(Calendar.DAY_OF_WEEK);
        //1일 - 요일 매칭 시키기 위해 공백 add
        for (int i = 1; i < dayNum; i++) {
            dayList.add("");
        }
        setCalendarDate(mCal.get(Calendar.MONTH) + 1);

        gridAdapter = new GridAdapter(getApplicationContext(), dayList);
        gridView.setAdapter(gridAdapter);

    }

    /**
     * 해당 월에 표시할 일 수 구함
     * 
     * @param month
     */
    private void setCalendarDate(int month) {
        mCal.set(Calendar.MONTH, month - 1);

        for (int i = 0; i < mCal.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
            dayList.add("" + (i + 1));
        }

    }

    /**
     * 그리드뷰 어댑터
     * 
     */
    private class GridAdapter extends BaseAdapter {

        private final List<String> list;

        private final LayoutInflater inflater;

        /**
         * 생성자
         * 
         * @param context
         * @param list
         */
        public GridAdapter(Context context, List<String> list) {
            this.list = list;
            this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public String getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ViewHolder holder = null;

            if (convertView == null) {
                convertView = inflater.inflate(R.layout.item_calendar_gridview, parent, false);
                holder = new ViewHolder();

                holder.tvItemGridView = (TextView)convertView.findViewById(R.id.tv_item_gridview);

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.tvItemGridView.setText("" + getItem(position));

            //해당 날짜 텍스트 컬러,배경 변경
            mCal = Calendar.getInstance();
            //오늘 day 가져옴
            Integer today = mCal.get(Calendar.DAY_OF_MONTH);
            String sToday = String.valueOf(today);
            if (sToday.equals(getItem(position))) { //오늘 day 텍스트 컬러 변경
                holder.tvItemGridView.setTextColor(getResources().getColor(R.color.color_000000));
            }
            return convertView;
        }
    }

    private class ViewHolder {
        TextView tvItemGridView;
    }

}
 

 

결과 화면입니다.

 

 

 

 

댓글을 달아 주세요

  • 이전 댓글 더보기
  • ittt 2016.05.12 00:48  댓글주소  수정/삭제  댓글쓰기

    bNextMonth.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    mCal = Calendar.getInstance();
    tvDate.setText(curYearFormat.format(date) + "/" + curMonthFormat.format(date));
    mCal.set(Integer.parseInt(curYearFormat.format(date)), Integer.parseInt(curMonthFormat.format(date)) - 1, 1);
    int dayNum = mCal.get(Calendar.DAY_OF_WEEK);
    //1일 - 요일 매칭 시키기 위해 공백 add
    for (int i = 1; i < dayNum; i++) {
    dayList.add("");
    }
    setCalendarDate(mCal.get(Calendar.MONTH) +1);
    gridView.deferNotifyDataSetChanged();
    }

    });

    다음달구하기위해서 notifyDatachanged();가 빨간줄이뜨길레 alt+enter 했더니 defer이 앞에 붙어서 메소드가 저렇게 바꼇습니다 ㅠㅠ
    근데 막상 다음달 버튼을 클릭하면 아무런 변화가 없네요 ㅠㅠ

    • Heum Heum's 2016.05.12 10:32 신고  댓글주소  수정/삭제

      gridAdapter.notifyDatasetChanged();
      이렇게 해보세요. 테스트 안하고 생각나는대로 올려서 잘못썼네요.
      Gridview에는 notifyDatasetChanged()가 없습니다.
      Adapter에서 사용하는거에요.

  • 학생1 2016.05.16 20:29  댓글주소  수정/삭제  댓글쓰기

    하나 여쭤보고 싶은데 혹시 달력에 날짜 밑에다가 메모하고싶은데
    어떻게 해야하나여? 메모는 간단하게 ox 넣으려구 해여

    • Heum Heum's 2016.05.17 10:16 신고  댓글주소  수정/삭제

      item_calendar_gridview.xml 여기에 O,X 표시할 TextView 하나 생성하면 됩니다. 그러면 달력에 날짜와 날짜밑에 text 2가지 생성되는거죠.
      달력 날짜 텍스트 어떻게 쓰는지 자바코드에서 찾아보시고 똑같이 사용하면돼요. holder.tvItemGridView -> 이게 달력 날짜입니다.

  • 학생1 2016.05.17 18:41  댓글주소  수정/삭제  댓글쓰기

    이거 이전달도 확인할수 있게 하는방법도 있나여?

  • tyyy 2016.05.23 20:26  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 일단 글 진짜 감사합니다ㅠㅠ 달력때문에 막막했는데 덕분에 해결이 됐어요 ㅠㅠ

    한가지 여쭤보고 싶은게 있는데, 이 달력을 탭뷰안에 넣는것도 가능한가요? 탭을 눌렀을때 이 달력이 뜨도록 만들고 싶은데 탭뷰가 너무 어렵네요 ㅠㅠ

    • Heum Heum's 2016.05.24 09:57 신고  댓글주소  수정/삭제

      저도 탭뷰는 사용해보지 않았는데 충분히 가능할 것 같은데요 ㅎㅎ
      화면 분할에는 Fragment 도 많이 사용하는데 어려우시면 이것도 한번 찾아보시고 자세히 질문 해주시면 도움드릴게요

  • 초보개발자 2016.05.28 18:02  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ! 캘린더 막막햇는데 깔끔하게 정리 잘해주셔서 보고 적용했습니다!
    이전달 이후달 버튼을 넣고 댓글에서 알려주신대로 적용다 해봤는데 달력이 새롭게 reset되는게 아니라 그밑에 바로이어서 생기더라구요 ㅠ.ㅠ 혹시 달력을 새롭게 reset하고 싶을땐 어떻게하면되는지 예를들어 알려주실수있으신가요..?ㅠㅠㅠ 초보개발자라 아직 많이부족합니다 ㅠㅠ

    • 초보개발자 2016.05.28 18:05  댓글주소  수정/삭제

      아!! 그리고 약간 오류같은데.. 다음달이 형성되긴하는데 매달 31일까지있어요 !

    • Heum Heum's 2016.05.30 10:29 신고  댓글주소  수정/삭제

      dayList가 초기화되지 않아서 리스트 뒤에 날짜가 계속 붙어서 그랬겠죠.
      날짜 변경할 때
      dayList = new ArrayList();
      해주면 될거같아요.
      31일이 계속 나오는거는
      setCalendarDate(mCal.get(Calendar.MONTH) +1);
      여기 문제이겠죠.
      파라미터 값 뭐가 넘어오는지 확인해보시구 수정하면 될거같아요.
      제가 테스트 할수있는 상황이 아니여서 ㅜㅜ

    • 초보개발자 2016.06.08 23:48  댓글주소  수정/삭제

      감사합니다! 다음달에 마지막날짜는 제가 뒤에 덧붙이면서 뭐가 이상해졌었나봐요!ㅠㅠ원래 소스코드에는 문제없었네용 죄송해요!! 제가 사용자에게서 날짜를 입력받으면 그 날짜를 일단 디비에집어넣은거까지했는데 사용자가 선택한 날짜를 달력에 작은 아이콘으로 표시하고싶은데 혹시 이건 어떤식으로 하면될지 아시나용..?ㅠㅠ

    • Heum Heum's 2016.06.13 09:22 신고  댓글주소  수정/삭제

      item_caledar_gridview.xml
      여기에 ImageView 생성해서
      날짜 선택했을때 이미지 visible, invisible 해주면 될거같습니다.
      iv.setVisibility(View.VISIBLE); // 화면에보임
      iv.settVisibility(View.INVISIBLE); // 화면에 안보임
      gridview에 setOnItemClickListener()를 사용하면 선택한 날짜 포지션 가져올수 있으니까 해당 포지션의 이미지뷰를 보이거나 안보이게 하면될거 같아요.

  • 김병희 2016.06.10 17:53  댓글주소  수정/삭제  댓글쓰기

    좋은 글 잘 보고 갑니다.
    베껴서 돌리니 훌륭하네요!
    친절하신 답변들도 눈에 띕니다.
    나중에 필요하면 제 블로그에도 올릴지 모르겠습니다.
    감사합니다.

  • honest 2016.08.08 10:44  댓글주소  수정/삭제  댓글쓰기

    mCal.set(Integer.parseInt(curYearFormat.format(date)), Integer.parseInt(curMonthFormat.format(date)) -1, 1);

    여기에 -1을 하는 이유는 뭔가요..??
    현재 월 데이터에서 -1을 하는데.. 지금 8월이면 -1햇을 때 7월되야 정상아닌가요..?
    그냥 1일이 3일뒤로 밀려나는데...이해가 안됩니당..

    • Heum Heum's 2016.08.09 11:56 신고  댓글주소  수정/삭제

      해당 부분은 이번달 1일이 무슨요일인지 구하는거 입니다.
      그래야 위에 요일이랑 매칭이 되죠.

      [일 월 화 수 목 금 토]
      얘네를 위에 고정 시켜놨으니 이번달
      1일이 무슨요일인지 구합니다.
      일(1) ~ 토(7)
      구하면 dayNum이 나오고 나온 만큼 띄어 주는거에요.
      mCal.set() 할때 month를 -1을 해줘야 제대로된 날짜가 설정이됩니다.
      mCal.getTime() 으로 날짜 확인해보면
      왜 -1했는지 이해 갈거에요

  • 2016.11.12 19:15  댓글주소  수정/삭제  댓글쓰기

    좋은 소스 감사합니다

  • Juns 2016.11.24 12:42  댓글주소  수정/삭제  댓글쓰기

    정말 도움이많이됐습니다 정말 감사합니다ㅠㅠ

  • 행인 2016.11.28 13:42  댓글주소  수정/삭제  댓글쓰기

    우선 소스 감사합니다.
    댓글보고 이전달 다음달 하고있는데
    dayList = new ArrayList<String>();
    이걸 for문위에 넣어도 refresh가 안되네요....
    bLastMonth.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {

    mCal = Calendar.getInstance();
    tvDate.setText(curYearFormat.format(date) + "/" + curMonthFormat.format(date));

    mCal.set(Integer.parseInt(curYearFormat.format(date)), Integer.parseInt(curMonthFormat.format(date)) - 1 - 1, 1);
    int dayNum = mCal.get(Calendar.DAY_OF_WEEK);
    //1일 - 요일 매칭 시키기 위해 공백 add
    dayList = new ArrayList<String>();
    for (int i = 1; i < dayNum; i++) {

    dayList.add("");
    }
    setCalendarDate(mCal.get(Calendar.MONTH) + 1);
    gridAdapter = new GridAdapter(getApplicationContext(), dayList);
    gridAdapter.notifyDataSetChanged();
    }
    });
    코드는 이렇게 했는데 반응이없는데 좀 알려주시면 안되나요?

    • Heum Heum's 2016.11.29 15:19 신고  댓글주소  수정/삭제

      코드상으로는 뭐가 문제인지는 잘 모르겠네요. 어떻게 안되는지 자세히 설명해주시거나, 클릭 이벤트는 제대로 되는지 원하는 날짜를 제대로 가져오는지 로그를 찍어 디버깅해서 어디가 문제인지 원인을 한번 찾아보세요 ㅜㅜ

  • 달팽이달리다 2016.12.19 17:09  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 안드로이드 초짜 달팽이달리다입니다.

    음.. 소스가 잘 이해가 안 가는 부분이 있어 질문드려요.

    먼저, Item_calendar_gridview.xml은 달력의 글자부분을 표시하는 xml파일인가요?

    그리고 글씨에 색 넣는 코드가 이해가 안가는데


    Integer today = mCal.get(Calendar.DAY_OF_MONTH);
    String sToday = String.valueOf(today);
    if (sToday.equals(getItem(position))) { //오늘 day 텍스트 컬러 변경
    holder.tvItemGridView.setTextColor(getResources().getColor(R.color.color_000000));
    }

    여기에서 position은 어떻게 값이 변경되는 걸까요?
    그리고 if문에서 position 값이 변경되어 숫자형 값이 리턴될 뿐인데 어떻게 그게 적용돼서 해당 날짜의 색이 변할수가 있는걸까요?
    holder.tvItemGridView.setTextColor(getResources().getColor(R.color.color_000000));
    이 코드상에서는 아무리 봐도 어떤 날짜에 색을 칠한다는 부분이 안보여서.. 헷갈리네요.

    지금

    for (int i = 0; i < mCal.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
    String Today = String.valueOf(i);
    if (Today.equals(getItem(position))) {

    holder.tvItemGridView.setTextColor(getResources().getColor(R.color.gray));
    }
    }
    if ("일".equals(getItem(0))) {
    holder.tvItemGridView.setTextColor(getResources().getColor(R.color.gray));
    }

    String sToday = String.valueOf(today);
    if (sToday.equals(getItem(position))) {
    holder.tvItemGridView.setTextColor(getResources().getColor(R.color.black));
    }

    이렇게 해서 제가 원하는 모양은 만들어내긴 했지만... 뭔가 제대로 한게 아니라 야매로 한 느낌... 쫌만 살짝 바꿔도 결과물이 말도 안되게 바껴서 어떻게 동작하는지 전혀 모르겠네요. 답변주시면 감사드리겠습니다.

    • 달팽이달리다 2016.12.19 17:11  댓글주소  수정/삭제

      덧붙여서 제가 구현한 소스가 뭐냐면요.

      올려주신 소스를 적용해 본 결과 오늘날짜를 제외한 나머지 날짜의(요일과 일) 색이 모두 흰색으로 나오더라구요. 그래서 회색으로 만들어 봤습니다.

    • Heum Heum's 2016.12.20 13:34 신고  댓글주소  수정/삭제

      Item_calendar_gridview.xml 날짜를 표현하는 xml 파일입니다.
      날짜 하나 하나를 gridview의 item이라고 합니다.
      getview()에서 position 로그를 찍어보면
      그리드뷰 아이템 수를 다 출력하는거를 알수있을거에요. 아이템 하나하나를 그린다고 생각하시면 될거같아요.
      결국 오늘날짜==포지션이 매칭되는 부분을 찾아서 글자 색을 변경시킵니다.
      GridView 공부해보세요. 이해될겁니다 ㅎㅎ

  • pmemyo@gmail.com 2016.12.28 11:51  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    안드로이드 개발을 시작한진 얼마 되지 않았지만 밥 벌어먹고 사는 주니어 개발자입니다.
    회사에서 프로젝트를 하나 맡았는데 스케줄 기능이 추가 되어 있어 찾아 보던 중 포스팅을 참고 하게 되었네요.
    유용한 정보를 올려 주셔서 너무 감사합니다.
    덕분에 이틀간의 고민거리가 사라졌네요~ 우후~
    새해 복 많이 받으세요.

  • java다잡아 2017.01.03 22:50  댓글주소  수정/삭제  댓글쓰기


    보고 잘 따라하고 저한테 맞게 변형하고 있습니다.
    근데 gridAdapter.notifyDatasetChanged(); 이부분에서 cannot resolve method 라는 오류가 뜨는데 왜그런것일까요?
    Button leftbtn = (Button) findViewById(R.id.leftbtn);

    leftbtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    mCal = Calendar.getInstance();
    mCal.set(Integer.parseInt(curYearFormat.format(date)), Integer.parseInt(curMonthFormat.format(date)) - 1 - 1, 1);
    int dayNum = mCal.get(Calendar.DAY_OF_WEEK);
    //1일 - 요일 매칭 시키기 위해 공백 add
    for (int i = 1; i < dayNum; i++) {
    dayList.add("");
    }
    setCalendarDate(mCal.get(Calendar.MONTH) + 1);
    gridAdapter.notifyDatasetChanged();
    }
    });
    이부분을 protected void onCreate(Bundle savedInstanceState) { ~~~~} 안에 넣어준 결과입니다.

    • Heum Heum's 2017.01.04 13:30 신고  댓글주소  수정/삭제

      private class GridAdapter extends BaseAdapter{}
      위 메소드에서 BaseAdapter
      상속하고있는지 확인해보세요.
      저기있는 소스 그대로 사용하면 잘될텐데요ㅜㅜ
      저렇게 일부만 보고는 잘모르겠네요..
      어디 빠져있는 코드가있는지도 확인해보세요!

  • 코딩어린이 2017.01.16 15:23  댓글주소  수정/삭제  댓글쓰기

    올려주신 자료보고 잘 구현하였습니다.
    달력의 달을 앞뒤로 넘기고
    그리드뷰 아이템을 클릭 하는 것까지요 .
    이제 아이템 포지션을 클릭했을때
    메모를 할수 있도록 메모장을 펼치고 싶은데 조언받을수 있을까요?
    클릭시 인텐트를 이용하여 새로운 xml를 불러와서 메모를 하고 싶은데
    만약 1월달 15번째 포지션에 저장을 했으면 2월달 15번째 포지션과 구별을 해야할것 같은데 ..

    • Heum Heum's 2017.01.16 15:40 신고  댓글주소  수정/삭제

      월(month)를 변수로 저장해놓고
      비교 하면 되겠네요.
      if(month = 1){
      memoLayout.setVisibility(View.VISIBLE);
      }else {
      memoLayout.setVisibility(View.GONE);
      }
      1월이면 레이아웃 보이고 아니면 안보이고
      클릭 이벤트도 막으세요 ㅎㅎ

    • 코딩어린이 2017.01.16 17:27  댓글주소  수정/삭제

      그럼 2월달 메모를 할수가 없지 않나요?
      각 아이템포지션 마다 메모를 넣을수 없을까요?ㅠㅠ

    • Heum Heum's 2017.01.17 12:54 신고  댓글주소  수정/삭제

      SharedPreference나 DataBase에 따로 메모를 저장해서 분류하면 되겠네요. 저장할때 Month랑 메모내용 저장하면
      Month로 데이터 불러 오면 돼요.
      SharedPreference가 사용하기 간편하니 찾아보세요.

    • 코딩어린이 2017.01.18 16:00  댓글주소  수정/삭제

      지금
      달력과 데이터베이스 메모장을 만들어놨는데 각각 따로 돌리면 잘 작동하는데
      온 아이템 클릭시에
      인텐트를 이용해 메모장을 불러오면 에뮬레이터 작동시 메모장으로 넘어가는 부분에서 갑자기 꺼지는데
      이런 이유가 무엇인지 아시나요??
      문법적인 오류도 아무것도 없는데 ...

    • Heum Heum's 2017.01.20 10:27 신고  댓글주소  수정/삭제

      에뮬레이터로는 테스트하는데 한계가 있을텐데요.. 테스트폰 하나구해서 해보시죠

  • 고등학생 2017.01.18 13:43  댓글주소  수정/삭제  댓글쓰기

    특정한 날짜를 클릭하면 아래쪽 화면에 값을 나타 낼 수는 없나요?
    즉 12/30 이 날이 방학이면 이 날를 클릭하면 '방학식' 이라고 뜨게끔는 할 수는 없나요?

    • Heum Heum's 2017.01.20 17:09 신고  댓글주소  수정/삭제

      간단하게 설명하면 GridView에서 클릭이벤트 어떻게 받아오는지 알아서 Intent로 새로운 layout을 띄우면 돼요
      아래 화면이면 layout 위치 조정하시고요.

  • ㅇㅇ 2017.07.18 11:01  댓글주소  수정/삭제  댓글쓰기

    안드로이드를 이제 막 배우는학생입니다..
    gridview로 만들지 않고 텍스트뷰를 배열을 이용해 칸을 만들었습니다.
    텍스트뷰로 만들 배열을 arraylist에 담아놓았는데
    거기에 달력을 어떻게 뿌려야 되는지 모르겠습니다....
    도와주세요 ㅠㅠㅠ

  • RV 2018.03.07 15:39  댓글주소  수정/삭제  댓글쓰기

    @color/color_ffffff 를 사용 하려면 colors.xml에 해당 이름이 있는지 확인 하신 후 따라해주세요

    본문에 이 내용을 추가 해주시면 많은 분들에게 도움이 될 것 같습니다.

  • it 초보 개발자 2018.03.29 18:13  댓글주소  수정/삭제  댓글쓰기

    현재 이 코드에서 월별로 넘기는걸 적용하려면 어떻게 해야 하나요??ㅜ
    이번달만 나와서.. 월별로 넘기면서 작업해야할거 같은데 혹시 적용방법이 있을가요?

  • centoss 2018.10.29 18:27 신고  댓글주소  수정/삭제  댓글쓰기

    포스팅 잘 봤습니다.
    한 가지 궁금한게 생겼는데요.
    날짜 시작하는 앞부분에 공백 말고
    이전달의 날짜들을 회색 글씨로 찍고...
    이번달 뒷부분에는 다음달 초반부 날짜를 찍고요...
    어떻게 처리해야 할 지 감이 잘 안오네요 ㅜ
    괜찮으시면 힌트좀 얻을 수 있을까요??


  • hhh 2018.11.17 22:27  댓글주소  수정/삭제  댓글쓰기

    좋은 소스 감사합니다. 열심히 만들어 보고 있는데
    그리드뷰를 이용하여 주별 달력도 만들수 있을까요?
    만약 만들게 된다면 월별 달력에서 이벤트를 표시하고 주별 달력과 어떻게 연동할수 있을까요??

 

안녕하세요.

원형 프로그레스 바 사용법과 그라데이션 효과 적용 및 컬러 변경방법에 대해 알아보겠습니다.ㅎㅎ

원형 프로그레스바 사용방법에는 여러가지가 있는데 제가 사용하는 방법은 원형 프로그레스 바를 RelativeLayout으로 두 프로그레스바를 겹쳐 사용하는 방식입니다.

우선 res -> drawable에 2가지 xml을 작성합니다.

 

<circular_progress_background.xml>

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@android:id/progress">
        <rotate
            android:fromDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="270" >
            <shape
                android:innerRadius="64dp"
                android:useLevel="true"
                android:shape="ring"
                android:thickness="10dp" >
                <gradient
                    android:centerColor="@color/color_ffffff"
                    android:endColor="@color/color_ffffff"
                    android:startColor="@color/color_ffffff"
                    android:type="sweep" />
            </shape>
        </rotate>
    </item>

</layer-list>

 

<circular_progress_foreground.xml>

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@android:id/progress">
        <rotate
            android:fromDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="270" >
            <shape
                android:innerRadius="64dp"
                android:useLevel="true"
                android:shape="ring"
                android:thickness="10dp" >
                <gradient
                    android:startColor="@color/color_edf436"
                    android:endColor="@color/color_3aedf4"
                    android:type="sweep" />
            </shape>
        </rotate>
    </item>

</layer-list>

android:startColor, android:endColor, android:centerColo로 그라데이션 효과를 적용할 수 있습니다ㅎㅎ

 

 

그 다음 res -> layout 폴더에 xml 파일 하나를 작성합니다.

<activityCircularProgressbar.xml>

<RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp" >

            <ProgressBar
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="148dp"
                android:layout_height="148dp"
                android:layout_centerInParent="true"
                android:indeterminate="false"
                android:progress="100"
                android:progressDrawable="@drawable/circular_progress_background" />

            <ProgressBar
                android:id="@+id/cpb"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="148dp"
                android:layout_height="148dp"
                android:layout_centerInParent="true"
                android:indeterminate="false"
                android:progressDrawable="@drawable/circular_progress_foreground" />
</RelativeLayout>

 

 

아래는 결과 화면입니다.

 

 

댓글을 달아 주세요