Swipe Refresh Layout 과 ViewPager 를 사용할 때가 많은데, 스크롤 이벤트가 잘못되어 부 자연스럽게 움직일 때가 있다. 이럴 땐... ViewPager에 onTouch 함수를 매핑해주자.
ViewPager mPager = (ViewPager) findViewById(R.id.pager);

mPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mLayout.setEnabled(false);
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                mLayout.setEnabled(true);
                break;
        }
        return false;
    }
});

'안드로이드' 카테고리의 다른 글

안드로이드 크래쉬 리포트  (0) 2015.02.10
windowSoftInputMode  (0) 2015.02.10
MODE_PRIVATE  (0) 2015.01.08
Fragment onCreateView inflate Exception  (0) 2014.12.26
TextView Font Size 코드  (0) 2014.11.06
Posted by 자바리즘
,

MODE_PRIVATE

안드로이드 2015. 1. 8. 12:55
개발을 하다보면, 사용자에게 보여주지 말아야할 리소스들이 있다. 그런 경우 ExternalStorage 보단 InternalStorage에 저장하는것이 보안상 좋다.

내부 캐쉬 파일 쓰기
        String filePath = "abcde.png";
        
        FileOutputStream outputStream = null;
        try {
			outputStream = _context.openFileOutput(filePath, Context.MODE_PRIVATE);
			bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
			outputStream.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}


위의 openFileOutput 인수중에 Context.MODE_PRIVATE 이녀석이 중요한 녀석입니다. 내부 Cache에 저장하겠다는 의미 입니다.

openFileOutput, openFileInput은 안드로이드 Context 클래스의 내장 함수 입니다.




내부 캐쉬 파일 읽기
       private Context _context;

       //Context 는 알아서 받아오자^^

        FileInputStream inputStream = null;
        try {
        	
            String filePath = "abcde.png";
        	
            inputStream = _context.openFileInput(filePath);
        	
        	Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            Bitmap copyBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
            bitmap.recycle();
        	
            return copyBitmap;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            IOUtils.closeQuietly(inputStream); 
            //IOUtils 라는 라이브러리 안에 있는 함수. Stream을 해제 해준다.
        }



참조 : http://developer.android.com/intl/ko/training/basics/data-storage/files.html


참고 : http://codeflow.co.kr/question/837/%ED%8C%8C%EC%9D%BC%EC%97%90-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0/

'안드로이드' 카테고리의 다른 글

windowSoftInputMode  (0) 2015.02.10
ViewPager 와 SwipeRefreshLayout  (2) 2015.01.19
Fragment onCreateView inflate Exception  (0) 2014.12.26
TextView Font Size 코드  (0) 2014.11.06
InputStream > Byte Array  (0) 2014.07.17
Posted by 자바리즘
,

앞전에 Interface 를 사용하는 이유를 기술 했었습니다.


그런데 개발 하다보니 이 사실을 잊고 개발을 하고 있었어요.


아래와 같은 생성자가 있다고 합시다.

2개의 파라미터

Context 와 EventListener 라는 녀석을 받고 있네요.


public Foo(Context context, EventListener listener)

{


}


EventListener 인터페이스는 아래와 같다고 합시당.

Interface EventListener

{

public void onClick();

}



EventListener 를 implements 하는 Book 클래스가 있다고 합시다.


public class Book implements EventListener

{

public void onClick()

{

}

}



위의 Foo 클래스의 생성자를 호출 할 때,

Book book = new Book();

Foo foo = new  Foo(getApplicationContext(),  book);


getApplicationContext() 는 안드로이드 Activitiy 안에 있는 내장 함수 입니다^^


book이 EventListener를 임플리먼츠 하고 있기 때문에 book 이 곧 EventListener 입니다.


이런식으로 다형성으로 인해, 생성자 호출이 가능해 집니다.

'개발이야기' 카테고리의 다른 글

소통하는 개발자  (0) 2015.08.12
배우는 법 배우기  (0) 2015.05.19
프로그래머 도움글  (0) 2014.08.26
이클립스 테마 바꾸기  (0) 2014.04.16
상속은 왜 하나?  (0) 2014.02.20
Posted by 자바리즘
,
       @Override
	public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.tour_detail_info_fragment, container, false);
                
                //TODO Create Layout
           
               return view;
        }
보통은 이런방식으로 fragment 의 view를 return 하는데. 간혹 FragmentTab 을 쓴다던지 할 때, 위 onCreateView를 실행해서 view 를 다시 그린다.
그런 과정에서 infalteException 이 발생 할 수 있다.

그럴 때는 아래와 같이 view 를 전역에 두고 null 체크를 하자.
      private View _rootView;

       @Override
	public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
				
		if(_rootView == null)
		{
			_rootView = inflater.inflate(R.layout.tour_detail_info_fragment, container, false);
                   
                        //CODE HERE

else
		{
			ViewGroup parent = ((ViewGroup)_rootView.getParent());
			if(parent != null)
			{
				parent.removeView(_rootView);
			}
		}
		
		return _rootView;

'안드로이드' 카테고리의 다른 글

ViewPager 와 SwipeRefreshLayout  (2) 2015.01.19
MODE_PRIVATE  (0) 2015.01.08
TextView Font Size 코드  (0) 2014.11.06
InputStream > Byte Array  (0) 2014.07.17
Bitmap Round  (0) 2014.06.05
Posted by 자바리즘
,

Suppressed: java.lang.ClassNotFoundException: android.support.v7.appcompat.R$styleable


이 에러 잡기가 무지 힘들었다...안드로이드 이눔의 자식...

라이브러리를 import 했을 때 아래와 같은 에러를 종종 볼 수 있다.
안드로이드의 RecycleView 때문에 android-support-v7-recycleview.jar 라이브러리를 사용했는데,
ActionBarToggle 사용을 위해 android-support-v7-appcompat.jar 와 충돌이 나는 문제였다.


해당 프로젝트를 오른쪽 마우스를 클릭해서 [properties]로 들어가자

Android Private Libraries 에 등록이 되있는것들과 충돌 나는 것이니 [Remove] 해주고, 프로젝트 [Clean]을 한 후, 다시 Build를 하자.




그러면 NoClassDefFoundError를 피할 수 있을 것이다.


암튼, android-support 라이브러리를 사용했을 때 항상 이런 문제가 났다. 아 짱나...



아! 그리고, 해당 라이브러리의 Resource 까지 사용하고 싶다면, jar 파일이 아닌 프로젝트를 임포트 해야한다.

android support 라이브러리는 sdk 다운 받은 경로로 들어가면 된다.


C:\dev\adb\sdk\extras\android\support\v7\appcompat


저는 dev라는 폴더에 adb라는 폴더를 생성하고, 그곳에 라이브러리들을 저장해두었다.



설명이 부족했나?...



음 암튼, 이건 경험이 해결해 줄것이다...쿨럭 :)

'안드로이드 > TIP' 카테고리의 다른 글

유용하게 개발하기  (0) 2017.06.21
Status bar Icon Size  (0) 2015.03.20
해상도별 아이콘 / 스플래시 이미지 사이즈  (0) 2015.03.06
해상도에 따른 위치  (0) 2014.11.06
Android Support Library AppCompat7  (0) 2014.10.01
Posted by 자바리즘
,

자바스크립트 코딩가이드


웹을 하시는 분이라면 자바스크립트는 필수 언어인데요, 코딩가이드를 참고하시고 작성하시면 개발이나 유지보수면에서 뛰어난 효과를 보실 수 있을 겁니다.


^^~ 열코딩



https://github.com/tipjs/javascript-style-guide/blob/master/README.md#conditionals

'' 카테고리의 다른 글

HTML 색상표  (0) 2014.10.01
Posted by 자바리즘
,

개발을 하다보면, 예기치 않게 배경을 두고 그 안에 무언가를(?) 올려야 할 때가 있다.


TextView 든, EditText 든...


내가 지향하는 스타일은 아니다. 난 정상적인 Layout을 XML로 짜서 하는 것을 선호한다.


그렇지만 기획이 그렇지 못할 경우도 다반사다.


그래서 준비한 코드가 바로 아래 코드이다.



               DisplayMetrics metrics = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(metrics);
		DPUtil dputil = DPUtil.getInstance(this);
		
		float density = dputil.getDensity();
		float densityDpi = dputil.getDensityDpi();
		
		int deviceWidth = metrics.widthPixels;
		int deviceHeight = metrics.heightPixels;
				
                //왼쪽에서 24% 이동한 위치
		int w = (int)((float)deviceWidth * 0.24f);

                //상단에서 30% 아래로 이동한 위치
		int h = (int)((float)deviceHeight * 0.3f);
		

                //DPi 에 따른 폰트사이즈 조정
		float font_size = 20f;
		if(densityDpi <= 240.0f)
		{
			font_size = 18f;
		}
 
                //tv 변수는 TextView의 변수. 알아서 판단해서 변경하시면 됩니다.

		//TextSize
		tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, font_size);
				
		//Set Margin
		LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
		params .setMargins(w, h, 0, 0);
		tv.setLayoutParams(std_no_params);

Posted by 자바리즘
,