728x90

전화가 걸려왔을 때 움직이는 팝업창으로 만드는 방법을 찾다가 구글링에서 찾은 것으로 테스트한 걸  적어둔다.

테스트 환경 : Android Studio 3.3


일반적인 코드

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


Draggable Code

View mPopupView;
WindowManager.LayoutParams mParams;
WindowManager mWindowManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE); // 타이틀바 없애기

    mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    mPopupView = getLayoutInflater().inflate(R.layout.activity_callingincoming, null);

    Display display = mWindowManager.getDefaultDisplay();
    @SuppressWarnings("deprecation")
    int width = (int) (display.getWidth() * 0.9); //Display 사이즈의 90%

    mParams = new WindowManager.LayoutParams(
            width,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_TOAST,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            PixelFormat.TRANSLUCENT);

    mParams.gravity = Gravity.CENTER | Gravity.START;
    mParams.x = 0; // initial position
    mParams.y = 0; // initial position

    mPopupView.setOnTouchListener(new View.OnTouchListener() {
        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    initialX = mParams.x;
                    initialY = mParams.y;
                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();
                    return true;
                case MotionEvent.ACTION_UP:
                    return true;
                case MotionEvent.ACTION_MOVE:
                    int newX = initialX
                            + (int) (event.getRawX() - initialTouchX); // new position
                    int newY = initialY
                            + (int) (event.getRawY() - initialTouchY); // new position
                    mParams.x = newX;
                    mParams.y = newY;
                    mWindowManager.updateViewLayout(mPopupView, mParams);
                    return true;
            }
            return false;
        }
    });

    isPopupChk();
    mWindowManager.addView(mPopupView, mParams);
}

public void isPopupChk(){ // 팝업창이 떠있는지 검사
    if (mPopupView.getParent() != null) {
        mWindowManager.removeView(mPopupView);
    }
}


https://stackoverflow.com/questions/10373078/transparent-activity-floating-draggable-on-homscreen

에 나온 Answer 를 참조해서 구현 성공했다.


테스트시 기본개념이 약해서 어려움을 겪었던 부분은

WindowManager.LayoutParams.WRAP_CONTENT,

WindowManager.LayoutParams.WRAP_CONTENT,

부분이었다.

폰 사이즈가 각각 다르므로 폰 사이즈가 달라도 화면에 보여주는 결과는 일정한 비율로 보여주도록 처리해야 하므로 이 부분을

WindowManager.LayoutParams.MATCH_PARENT,

WindowManager.LayoutParams.WRAP_CONTENT,

로 변경하고 일정한 비율로 Linearlayout 을 구현하고나서 원하는 결과를 얻었다.


추가 확인 사항

- 삼성 갤럭시 노트 8(안드로이드 7.1.1)에서 팝업창 방식으로 activity 를 동작시키니까 창이 1~2초후 사라진다.

- 삼성 갤럭시 S7, S8 (안드로이드 7.0) 에서는 팝업창 방식(service, activity) 모두 정상 동작한다.

- 삼성 갤럭시 노트 8 에서 Main UI 방식으로 동작시키니까 팝업창 오랫동안 지속된다.

블로그 이미지

Link2Me

,
728x90

체크박스(checkbox) 전체를 선택/해제하는 jQuery 예제다.

checkall input 박스 변화를 감지하여

$("#check_item").children("input").attr("checked", true); 하거나

$("#check_item").children("input").attr("checked", false); 한다.


attr() 사용시
- HTML attribute 값이 모두 String 으로 넘어옴

prop() 사용시
- Javascript의 프로퍼티 값이 넘어오기 때문에 boolean, date, function 등도 가져올 수 있음


<input type="checkbox" name="" id="chk" checked="checked">

var $checkbox = $('#chk');
console.log($checkbox.attr('checked')); // checked속성의 값을 표시 → "checked"
console.log($checkbox.prop('checked')); // checked프로파티값을 표시 → true or false

체크가 되어있는지 판단을 할경우 .prop()을 사용할 필요가 있다.


체크박스를 전체 선택하고 해제하는 스크립트를 쓰려면 .prop()로 true/false 를 제어하자.

For jQuery 1.6+ :
.attr() is deprecated for properties; use the new .prop() function instead as

$('#myCheckbox').prop('checked', true); // Checks it
$('#myCheckbox').prop('checked', false); // Unchecks it


For jQuery < 1.6:
To check/uncheck a checkbox, use the attribute checked and alter that.
With jQuery you can do:
$('#myCheckbox').attr('checked', true); // Checks it
$('#myCheckbox').attr('checked', false); // Unchecks it


<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>form ex</title>
<style>
body {
    margin: 20px;
    font-family: "맑은 고딕";
}
input[type=checkbox] {
    border: 1px solid #ccc;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$(function(){
    $("#checkall").change(function(){
        $("input:checkbox").prop('checked', $(this).prop("checked"));
        /*
        if(this.checked){
            $("#check_item").children("input").attr("checked", true); // checked="true"
        }else{
            $("#check_item").children("input").attr("checked", false); // checked="false"
        }
        */
    });
    $("input[name=chkname]").click(function(){ // 개별 선택을 누르면 전체 선택 체크가 풀리게 처리
        if($("#checkall").is(":checked")==true){
            $("input:checkbox[name=checkall]").prop("checked",false);
        }
       console.log($(this).val());
    });

});
</script>
</head>

<body>
<input type="checkbox"  name="checkall" id="checkall" />
<label>All</label>
<div id="check_item">
    <input type="checkbox" name="chkname" value="1" />
    <label>홍길동</label>
    <input type="checkbox" name="chkname" value="2" />
    <label>강감찬</label>
    <input type="checkbox" name="chkname" value="3" />
    <label>이순신</label>
</div>
</body>
</html>

'Web 프로그램 > js, jQuery' 카테고리의 다른 글

jQuery animate  (2) 2018.02.14
jQuery addClass()  (0) 2018.02.04
[jQuery] 테이블 다루기 (find)  (0) 2018.01.15
JavaScript 와 jQuery 비교 정리  (0) 2018.01.15
[Javascript] Form 객체 다루기 (자바스크립트 와 jQuery)  (0) 2017.12.16
블로그 이미지

Link2Me

,
728x90

HTML(Hyper Text Markup Language)은 태그로 구성되어 있다.
- HTML 태그는 기본적으로 '<' 기호로 시작하여 '>'로 끝난다.
- 브라우저에서 HTML을 파싱할 때는 꺽쇠기호 <> 를 HTML 태그의 시작과 끝으로 인식 할 수 있다
- 따옴표 " "는 HTML 속성의 값이 시작되거나 끝난 것으로 인식할 수 있다.
- & 기호는 Entity 기호의 시작으로 오인될 수 있다.

HTML 에서 special character 를 나타내는 방법은 두가지가 있다.
Numeric HTML entity, Symbolic HTML entity 다.
http://entitycode.com/ 에 가면 주요 특수문자을 찾을 수 있다.
http://dmobi.tistory.com/72 에도 많은 특수문자를 참조할 수 있다.

"<", ">", "&" 이런 기호들을 Web 브라우저에서 제대로 표현하려면 &lt; &gt; &amp; 로 변환해주어야 한다.

PHP에서는
htmlspecialchars() HTML에서 사용하는 특수문자를 변경해주는 역할을 한다.


stripslashes()는 따옴표에 붙는 백슬래시를 제거해주는 함수다.
따옴표에 백슬래시를 붙여주는 함수는 addslashes() 다.
HTML 코드를 DB에 저장할 때 따옴표나 여러 특수문자 때문에 에러를 발생하기도 한다
DB에 저장할 때는 특수문자를 적절하게 변경해주어야 한다.


PHP에서 HTML 구문을 그대로 출력하기 위해 htmlspecialchars를 사용하여 인코딩된 문자열을  DB에 넣어준다.
반대로 DB에 있는 값을 불러와 HTML 소스로 변환할 때는 일반적으로 htmlspecialchars_decode를 많이 사용한다.
그런데 이 함수를 사용하는데 문제가 있다. htmlspecialchars_decode는 &nbsp;를 공백으로 다시 되돌려 주지 않는다.


&nbsp;와 같은 것은 html_entity_decode를 사용하면 된다.
이 함수는 htmlentities와 대응되는 함수이다.

htmlspecialchars와 htmlentities는 유사하나 htmlentities가 더 많은 문자를 변환한다.
htmlspecialchars_decode와 html_entity_decode는 유사하나 html_entity_decode가 더 많은 문자를 되돌린다.


$str = "I'll \"walk\" the <b>dog</b> now.\n";

$str_encode = htmlentities($str);
echo $str_encode; // I'll &quot;walk&quot; the &lt;b&gt;dog&lt;/b&gt; now.

$str_decode = html_entity_decode($str_encode);
echo $str_decode; // I'll "walk" the <b>dog</b> now.


$str = "<a href=\"https://www.w3schools.com\">w3schools.com</a>\n";
$str_encode = htmlentities($str);
echo $str_encode; // &lt;a href=&quot;https://www.w3schools.com&quot;&gt;w3schools.com&lt;/a&gt;

$str_decode = html_entity_decode($str_encode);
echo $str_decode; //  



PHP 버전이 낮은 경우에는 get_magic_quotes_gpc()함수로 magic_quotes 값을 확인 후 써야 한다.
그렇지 않으면 불필요한 백슬래시까지 데이터로 처리하는 경우가 발생하기 때문이다.
Returns 0 if magic_quotes_gpc is off, 1 otherwise.
PHP 5.4.0. always returns FALSE because the magic quotes feature was removed from PHP.

if ( get_magic_quotes_gpc() ) {
    $str = htmlspecialchars( stripslashes( $str) ) ;
}else{
    $str = htmlspecialchars( $str) ;
}

// Usage across all PHP versions
if (get_magic_quotes_gpc()) {
    $lastname = stripslashes($_POST['name']);
}
else {
    $lastname = $_POST['name'];
}

문자 치환이 필요한 경우
- DB와 연동하기 위해 특수문자 또는 줄바꿈 처리시
- 게시판에서 특정 문자의 제거 또는 치환으로 특수문자와 줄바꿈 변경에 자주 사용

블로그 이미지

Link2Me

,
728x90

아래 예제는 생활코딩에서 설명하는 강좌 내용을 적는다.

<html>

<head>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>

</head>

<body>

<ul>

    <li class="marked">html</li>

    <li>css</li>

    <li id="active">JavaScript

        <ul>

            <li>JavaScript Core</li>

            <li class="marked">DOM</li>

            <li class="marked">BOM</li>

        </ul>

    </li>

</ul>

<script>

    //$( ".marked", "#active").css( "background-color", "red" );

    //$("#active .marked").css( "background-color", "red" );

    $("#active").find('.marked').css('background-color','blue');

</script>

</body>    

</html>


$(".marked", "#active").css( "background-color", "red" );

$("#active .marked").css( "background-color", "red" );

$("#active").find('.marked').css('background-color','red');

는 모두 동일한 결과를 출력한다.


find는 jQuery 객체 내에서 어떤 요소(기준요소)의 하위 요소 중 특정 요소를 찾을 때 사용한다.



CSS 테이블에 대한 사항은 http://link2me.tistory.com/1463 를 참조하라.


테이블을 jQuery 로 다루는 걸 적어둔다.

children()은 부모 요소의 바로 아래 단계인 자식요소만 선택할 수 있으나, 
find()는 부모 태그의 모든 하위 요소의 자식을 선택하여 가져올 수 있다.


$.each() 메서드는 object 와 배열 모두에서 사용할 수 있는 일반적인 반복 함수다.

첫번째 매개변수로 배열이나 객체를 받는다.

두번째 매개변수로 콜백함수를 받으며, 콜백함수의 인자로는 인덱스와 값을 인자로 갖는다.

$.each(arr, function (index, item) {
});


$('.list li').each(function (index, item) {
});



$("table tbody tr").click(function(){

     var tr = $(this); // 현재 클릭된 row

     var td = tr.children();

     // 반복문을 사용해서 배열에 값을 담아보기

     var tdArray = new Array(); // 배열선언

     td.each(function(i){

         tdArray.push(td.eq(i).text());

     });

     console.log("배열에 담은 값 : " + tdArray);

     // 특정 셀 값 알아내기

     var customerId = $(this).find("td").eq(2).html();

});


$("table tbody tr td").click(function(){

    var td = $(this); // 현재 클릭된 셀

    var val = td.text(); // 현재 선택된 셀의 값

    var id=$(this).attr("id"); // 셀에 지정된 속성값

});


<!DOCTYPE html>
<head>
<meta charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA Compatible" control="IE=edge,chrome=1" />
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script>
$(function(){
    // tr 태그에 마우스를 올릴때
    $('table tbody tr').mouseover(function() {
        $(this).children().css({
            'backgroundColor' : '#DCDCDC',
            'cursor' : 'pointer'
        });
    }).mouseout(function() {
        $(this).children().css({
            'backgroundColor' : '#FFFFFF',
            'cursor' : 'default'
        });
    });

    // 전체 선택, 전체 해제
    $("#checkall").change(function() {
        $("input:checkbox").prop('checked', $(this).prop("checked"));
    });

    $('#select_chkbox').click(function(i) {
        var rowData = new Array();
        var chkData = new Array();
        var checkbox = $('input:checkbox[name="uid[]"]:checked');
        checkbox.each(function(i){ // 반복되는 태그 단위를 찾아서 each() 함수 사용
           var select_value = $(this).val();
           chkData.push(select_value);

           // checkbox.parent() : checkbox의 부모는 <td>
           // checkbox.parent().parent() : <td>의 부모이므로 <tr>
           var tr = checkbox.parent().parent().eq(i);
           var td = tr.children();
           rowData.push(tr.text()+"<br />");
        });
        if (rowData.length == 0) {
           $("#chk_result").html("선택항 항목이 없습니다").css("color", "blue");

           $("#rawData_result").html("");

        } else {
           $("#chk_result").html("선택된 체크박스 값 : "+chkData).css("color", "blue");
           $("#rawData_result").html("체크된 Row의 모든 데이터 : <br /> "+rowData);
        }
    });

    var sum = 0;
    $('table tbody tr').each(function(){ //테이블 모든 tr에 순차 접근
       if($.isNumeric($("td:eq(4)",this).text())){ //해당 tr의 다섯번째 td에 접근해서 숫자인지 확인
           sum += parseInt($("td:eq(4)",this).text());//해당하는 값을 숫자로 변환해서 누적합산 처리
       }
    });
    $("#sum").text("수량 합계 : "+sum.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));// sum을 출력

});
</script>
</head>
<body>
<div class="container">
    <div class="row">
        <table class="table table-hover">
        <thead>
        <tr>
        <th class="header" width="30"><input type="checkbox" id="checkall" /></th>
        <th class="header" width="100">No</th>
        <th class="header" width="250">품목</th>
        <th class="header" width="250">가격</th>
        <th class="header" width="200">수량</th>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td><input type="checkbox" class="chkbox" name="uid[]" value="7" /></td>
            <td>7</td>
            <td>사과</td>
            <td>5</td>
            <td>5</td>
        </tr>
        <tr>
            <td><input type="checkbox" class="chkbox" name="uid[]" value="6" /></td>
            <td>6</td>
            <td>수박</td>
            <td>4</td>
            <td>500</td>
        </tr>
        <tr>
            <td><input type="checkbox" class="chkbox" name="uid[]" value="5" /></td>
            <td>5</td>
            <td>사과</td>
            <td>3</td>
            <td>3</td>
        </tr>
        <tr>
            <td><input type="checkbox" class="chkbox" name="uid[]" value="4" /></td>
            <td>4</td>
            <td>수박</td>
            <td>2</td>
            <td>500</td>
        </tr>
        <tr>
            <td>
            <input type="checkbox" class="chkbox" name="uid[]" value="3" />
            </td>
            <td>3</td>
            <td>복숭아</td>
            <td>7</td>
            <td>50</td>
        </tr>
        <tr>
            <td>
            <input type="checkbox" class="chkbox" name="uid[]" value="2" />
            </td>
            <td>2</td>
            <td>사과</td>
            <td>8</td>
            <td>90</td>
        </tr>
        <tr>
            <td>
            <input type="checkbox" class="chkbox" name="uid[]" value="1" />
            </td>
            <td>1</td>
            <td>망고</td>
            <td>555</td>
            <td>40</td>
        </tr>
        </tbody>
        <td colspan="5" style="text-align:left;">
        <button type="button" class="btn btn-success btn-sm" id="select_chkbox">선택</button>
        </table>
    </div>
    <div id="chk_result"></div>
    <div id="rawData_result"></div>
    <div id="sum"></div>
</div>

</body>
</html>
 


'Web 프로그램 > js, jQuery' 카테고리의 다른 글

jQuery addClass()  (0) 2018.02.04
jQuery all Checked  (0) 2018.01.23
JavaScript 와 jQuery 비교 정리  (0) 2018.01.15
[Javascript] Form 객체 다루기 (자바스크립트 와 jQuery)  (0) 2017.12.16
[jQuery] Table Filtering  (0) 2017.12.13
블로그 이미지

Link2Me

,
728x90

jQuery 로 간단하게 하는 것이 Javascript 코드와 비교표를 통해서 정리하며, 계속 추가할 것이다.


jQuery

JavaScript

$(document).ready(function() {

});

또는

$(function () {
});

 window.onload=function(){

}

 $("p").css("background-color", "#f60");

 var p=document.getElementsByTagName("p");

 p.style.backgroundColor="#f60";

 $("#navi").css("background-color", "#f60");

 var navi=document.getElementById("navi");

 navi.style.backgroundColor="#f60";


 $("#element1").on('click', function() {
        // do something on click
 }

 또는  
$("#element1").click(function() {
        // do something on click
 });

 var x = document.getElementById("element1");
if (x.addEventListener) { // IE 9 이상, 타브라우저
    x.addEventListener("click", myFunction);
} else if (x.attachEvent) { // For IE 8 and earlier versions
    x.attachEvent("onclick", myFunction);
}

 document.getElementById("element1")

.addEventListener('click',doSomething,false);

$('#outer').on('mouseup', function (event) {
    alert('This alert should not show up!');
}, false);

document.getElementById('outer').addEventListener('mouseup', function (event) {
    alert('This alert should not show up!');
}, false);

 $(".class1.class2").eq(0).text(1254);

 document.querySelectorAll('.class1.class2')[0].textContent = 1254;

 document.querySelectorAll('.class1.class2')[0].innerHTML = 1254;


jQuery 개발시 주의사항

jQuery CDN에 있는 jquery-latest.js 라는 최신 버전을 사용하는 것에 주의해야 한다.

개발할 당시에 사용했던 버전에 최적화되어 있을 수 있으니 반드시 최신버전이 좋은 것은 아니다.

Javascript 를 모르고 jQuery 만 배우면 한계에 부딪치므로 기초부터 튼튼히 배우는 게 좋은데 체계적으로 배우지 않아서 그런지 쉽지 않다.

jQuery 라이브러리만 사용하지 말고 어떻게 코딩하면 고객에게 더 좋은 Web  페이지를 제공해 줄 수 있는지 어떻게 하면 더 깔끔하게 개발할 수 있는지 고민을 하는 것이 바로 고급 Web 개발자로 들어서는 길이란다.


블로그 이미지

Link2Me

,