[Android]스크롤 뷰 안에 웹뷰가 있을 경우 스크롤 뷰만 스크롤 되는 문제(Webview inside ScrollView scrolled only ScrollView)

Posted by Find my true self Fimtrus
2017.07.28 10:19 Programming/Android

스크롤뷰 안에 스크롤이 필요한 경우


NestedScrollView를 이용하여, 스크롤이 되게 할 수 있는데,


웹뷰의 경우는 웹페이지가 스크롤이 필요한 경우라 NestedScrollView로 해결 할 수 없다.


해당 문제를 해결하기 위해선, 웹뷰에서 발생하는 터치 이벤트를


다른 뷰에 뺏기지 않아야 원하는 결과를 얻을 수 있다.



먼저 웹뷰를 상속 받는 클래스를 하나 만든다.

상속 받은 웹뷰 클래스에 onTouchEvent 메소드를 Overriding 한다.


public class RoadView extends WebView {

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(event);
    }
}


requestDisallowInterceptTouchEvent(true)를 추가 하면 웹뷰 단에서 처리할 코드는 완료된다.


이 메소드는 웹뷰에서 발생하는 이벤트를 다른 뷰에서 가로채는 것을 막는 역할을 한다.


따라서 부모뷰인 스크롤뷰가 웹뷰에서 발생하는 이벤트를 가로채지 못하게 된다.




마지막으로 아래와 같이 xml에 적용 하면 스크롤이 가능한 웹뷰가 만들어진다.

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

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

                <com.fimtrus.test.view.RoadView
                    android:id="@+id/roadview"
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    android:layout_marginBottom="16dp" />
               
        </LinearLayout>
    </ScrollView>
</LinearLayout>


이 댓글을 비밀 댓글로

[Android] 툴바(Toolbar)와 맵뷰(MapView) 사용시 지도가 정상적으로 표시되지 않는 문제

Posted by Find my true self Fimtrus
2017.05.16 12:20 Programming/Android

툴바와 맵뷰를 같이 사용하게 되면 맵뷰 화면이 정상적으로 렌더링이 되지 않는다.


맵뷰 플래그먼트가 자리를 제대로 잡지 못해서 생기는 현상으로 보이는데, 아래와 같이.. 레이아웃을 잡아주면 된다.


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<include
layout="@layout/toolbar"/>

<FrameLayout
android:id="@+id/layout_content"
android:layout_below="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"></FrameLayout>

</RelativeLayout> 



이코드의 핵심은 android:layout_below="@+id/toolbar"


툴바의 아이디를 써주게 되면 맵이 정상적으로 표시되게 된다..

이 댓글을 비밀 댓글로

[Android] Lollipop 버전에서 Support Fragment 화면 갱신이 안될때(ListView, Button 등)

Posted by Find my true self Fimtrus
2017.04.20 16:32 Programming/Android

요즘 안드로이드 개발 추세는 Activity 위에 Fragment를 올리는 형태를 많이 취한다.


그리고 많은 단말기를 지원하기 위해 Support Activity, Support Fragment를 사용한다.



Activity는 FragmentController 역할을, Fragment는 뷰를 제어한다.


나도 위와 같은 형태로 안드로이드 앱 개발을 진행하는데, 가끔 생각지 못한 버그를 접하게 된다.


최근 개발 중에 Fragment의 화면이 갱신이 되지 않는  버그를 접했다.


플래그먼트에 리스트뷰, 그리고 토글 버튼들을 배치 하였는데, 


이벤트는 발생을 하나, 화면이 새로 그려지지 않았다.


문제는 FragmentManager를 통해 다른 플래그먼트를 불러오는데,


애니메이션을 적용하게 되면, 새로 불려진 플래그먼트 화면이 갱신이 되지 않았다.


모든 단말기에서 발생하는 문제는 아니고, 특정단말기(롤리팝)에서만 발생하는 이슈였는데 동작하지 않는 이유에 대해 찾기가 쉽지 않았다.



/*
 * 문제의 코드
 */ 
getFragmentManager().beginTransaction()
                .setTransition(FragmentTransaction.
                        TRANSIT_FRAGMENT_FADE)
                .addToBackStack("test")
                .replace(R.id.layout_content, new TestFragment()).commit();


위 코드의 문제점은 setTransition 메소드를 사용하여 플래그먼트가 전환될 때 애니메니션을 적용시켰다는 점이다.


좀 예쁘게 만들려고 적용시켰더니....


그래서 setTransition코드를 제거하고 빌드하니 정상적으로 동작하는 것을 확인할 수 있었다..


/*
 * setTransition 주석 처리..
 */ 
getFragmentManager().beginTransaction()
//                .setTransition(FragmentTransaction.
//                        TRANSIT_FRAGMENT_FADE)
                .addToBackStack("test")
                .replace(R.id.layout_content, new TestFragment()).commit();


Support Library를 사용하여 개발하게 되면 보다 편리하게 구현할 수 있지만


가끔 이런 난감한 문제에 봉착할때가 있다는 사실을 다시금 깨닫게 해주는 이슈였다.



이 댓글을 비밀 댓글로

[Android] 스테이터스바 컬러 변경(Change Statusbar Color) 

Posted by Find my true self Fimtrus
2017.04.14 10:40 Programming/Android
기본으로 적용시킨 스테이터스바 컬러 이외에 

특정 플래그먼트 또는 액티비티에서 스테이터스바 컬러를 변경해야할 때가 있다.


롤리팝 이상 버전부터 코드 상에서 컬러를 변경할 수 있는데 


변경하기 위해선 styles.xml 에 아래 코드를 넣어 줘야 한다.( 앱 테마가 적용된 부분)


롤리팝 이상부터 동작하기 때문에 values-v23 에 적용시키면 된다.


<item name="android:windowDrawsSystemBarBackgrounds">true</item>


그리고 아래 메소드를 통해 스테이터스바의 컬러를 변경하면 된다.~



//컬러 코드로 변경(예: #373737)
public static final void updateStatusBarColor (Activity context, String color) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = context.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.parseColor(color));
        }
    }
//컬러 리소스로 변경(예 : R.color.deep_blue)
 public static final void updateStatusBarColor (Activity context, int colorId) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = context.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(ContextCompat.getColor(context, colorId));
        }
    }



이 댓글을 비밀 댓글로

[Android] LinearLayout 에 View 동적 추가시 weight 주는 방법

Posted by Find my true self Fimtrus
2017.04.13 10:27 Programming/Android

linearlayout에 하위뷰를 추가해야 하는 경우가 있다.


여러 개가 추가될 경우 좌우 또는 상하 간격을 동일하게 주기 위해 weight 를 줘야 하는데, ViewGroup을 만들어 Parent 뷰로 묶지 않는 이상


xml 단에서 아무리 weight를 줘도, 제대로 동작하지 않는다.


이 문제를 해결하기 위해서는 뷰를 추가할 때 아래와 같이 LayoutParams를 함께 적용 시켜 주면 된다.



LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        layoutParams.weight = 1;
        viewHolder.linearLayout.addView(this.inflater.inflate(R.layout.view_test_item, null, false), layoutParams);
        viewHolder.linearLayout.addView(this.inflater.inflate(R.layout.view_test_item, null, false), layoutParams);
        viewHolder.linearLayout.addView(this.inflater.inflate(R.layout.view_test_item, null, false), layoutParams);
        viewHolder.linearLayout.addView(this.inflater.inflate(R.layout.view_test_item, null, false), layoutParams);
        viewHolder.linearLayout.addView(this.inflater.inflate(R.layout.view_test_item, null, false), layoutParams);
이 댓글을 비밀 댓글로

[Android] 안드로이드 버튼 음영 제거(Remove button shadow on Android)

Posted by Find my true self Fimtrus
2017.04.10 20:32 Programming/Android

안드로이드 버튼의 음영을 제거할 필요가 있을 때가 있다.


xml 파일의 button 속성 값을 추가하게 되면 간단하게 해결 된다..



android:stateListAnimator="@null"
이 댓글을 비밀 댓글로

[Android] TextSize, 텍스트 사이즈 DIP, DP 코드로 적용 방법

Posted by Find my true self Fimtrus
2017.03.29 11:39 Programming/Android

 안드로이드에서 텍스트뷰의 텍스트 크기를 코드로 조절해야될 때가 있다.


여러가지 방법이 있지만 아래 방법을 가장 많이 쓰는 것 같다.


textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 22)


이 댓글을 비밀 댓글로

[Android] 키보드 위에 레이아웃, 버튼 올리기

Posted by Find my true self Fimtrus
2016.07.26 15:52 Programming/Android

자주 작업할 때는 적용 시키기가 쉽지만,,


한동안 작업을 하지 않다가, 막상 버튼을 키보드 위에 올리려고 하면,


가물가물...



먼저 적용하려고 하는 Activity의 Manifest 정보에


android:windowSoftInputMode="adjustResize"

를 추가한다.


이 옵션은 키보드가 화면을 가렸을 때


현재 보여지는 화면의 크기로 리사이징을 할 것인지에 대한 값이다.


따라서 위의 옵션을 주게 되면 Activity 화면 크기 자체가 줄어들게 된다.


그리고 적용시킬 레이아웃 또는 버튼에 아래와 같이 추가하면 된다.




RelativeLayout에서 alignParentBottom을 주면 키보드 위로 올라오게 배치할 수 있었지만..


가끔 안먹을 때가 있어서...고민을 많이 하게 되는데.


위와 같이 적용시 간단하게 적용이 가능하다.



이 댓글을 비밀 댓글로

[Android] 클릭 이벤트를 뒤에 배치된 레이아웃에 전달되지 않게 하기

Posted by Find my true self Fimtrus
2015.11.27 17:22 Programming/Android

느낌은 아는데 제목을 정하기가 쉽지 않군요.


레이아웃을 작업할 때 뒤에 배치된 버튼이나 레이아웃에 대한 클릭이벤트를 무시하고 싶을 때가 있습니다.


화면 전체를 덮는 레이아웃을 만들어서 하위에 있는 이벤트를 막는 경우도 있구요.


아래의 코드를 화면 전체를 덮는 최 상단 레이아웃에 적용 시키면, 하위에 있는 레이아웃에 클릭이벤트가 전달되지 않습니다.


 


mTopLayout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});


위의 코드에서  핵심은 return 값을 true 주는 것인데 Developer 에는 아래 와 같이 적혀 있습니다.


Returns
  • True if the listener has consumed the event, false otherwise.

해석해 보면 true로 설정할 경우 이벤트를 없애고(즉, 다음에 받을 차례인 리스너들에게 전달하지 않는다는 뜻입니다),  


false 인 경우 이벤트를 넘겨준다는 말이군요.


클릭이벤트 때문에 고생하시는 분들 위의 코드를 적용해보세요~




이 댓글을 비밀 댓글로

[Javascript,Java]ReplaceAll 에서 점, dot(.) 문제 해결하기.

Posted by Find my true self Fimtrus
2015.10.08 15:37 Programming/Web

자바스크립트에는 replaceAll이 존재하지 않는데 기본으로 제공하는 것처럼 포스팅 했군요.


 replaceAll 관련 function을 추가하는 포스팅을 했었는데요.


관련 페이지를 첨부합니다.


[Javascript] 자바스크립트에서 replaceAll 하기 (Click!)


======================================================================================


자바스크립트에서 replace를 사용하였을때 점(.)이 다른 문자로 잘 치환되나,


replaceAll을 사용하였을 경우 모든 문자로 인식하는 문제점이 있다.


물론 자바에서도 마찬가지 인데, 간단하게 아래와 같이 사용하면 점(.)을 다른 문자로 치환할 수 있다.



//replaceAll 테스트
"2015.10.08".replaceAll("\\.", "/");


엔터 위에 있는 원 통화 표시 문자를 두개 넣고, 점( .) 을 입력하면,


"2015.10.08"  이 "2015/10/08"로 정상적으로 변환된다.



이 댓글을 비밀 댓글로