안녕하세요.

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>



Class 파일

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문안에 페이징 처리나 바닥에 닿았을때 처리하고 싶은 이벤트 코드 작성해 주시면됩니다.

블로그 이미지

Heum's

IT 관련 지식 공유

이클립스 프로젝트를 안드로이드 스튜디오로 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{}부분이 생성되지 않아 추가해주니 에러 사라지고 정상적으로 실행되었습니다.


블로그 이미지

Heum's

IT 관련 지식 공유

안녕하세요.

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

DisplayMetrics dm = new DisplayMetrics();

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

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

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

블로그 이미지

Heum's

IT 관련 지식 공유

안녕하세요.

안드로이드 멀티터치 기능을 막는 방법 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>


styles.xml에 위와 같이 테마를 적용해주시고.


AndroidManifest.xml

<application

        android:theme="@style/splitTheme" >

</application>



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

블로그 이미지

Heum's

IT 관련 지식 공유

안녕하세요.

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


자바 코드에서 적용할 경우

imageView.setScaleType(ScaleType.FIT_XY);



Xml에서 적용할 경우

<ImageView

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:scaleType="fitXY" />



적용해 주시면 잘됩니다.

블로그 이미지

Heum's

IT 관련 지식 공유

안녕하세요.

안드로이드 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를 종료시키는 방법이 있습니다.



결과화면








블로그 이미지

Heum's

IT 관련 지식 공유

안녕하세요.

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);

    }


블로그 이미지

Heum's

IT 관련 지식 공유

안녕하세요.

안드로이드 이미지뷰 작업할 경우 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를 써주세요 



결과화면







블로그 이미지

Heum's

IT 관련 지식 공유

안녕하세요.

페이스북 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();


블로그 이미지

Heum's

IT 관련 지식 공유

안녕하세요.

안드로이드 상태바 (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);



결과 화면



블로그 이미지

Heum's

IT 관련 지식 공유