2017년 1월 8일 일요일

Android App 시작 시점에 표시되는 virtual keyboard 숨기기

App의 시작 화면에 EditText가 있어 시작될 때 마다
Virtual Keyboard가 항상 표시되는 상황이라 귀찮아서 숨기려 하여 찾아봄.

일단 인터넷에서 소개되는 방법은..

InputMethodManager를 사용하여 virtual keyboard를 숨기는 방법

http://stackoverflow.com/a/1109108

You can force Android to hide the virtual keyboard using the InputMethodManager, calling hideSoftInputFromWindow, passing in the token of the window containing your focused view.
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
This will force the keyboard to be hidden in all situations. In some cases you will want to pass in InputMethodManager.HIDE_IMPLICIT_ONLY as the second parameter to ensure you only hide the keyboard when the user didn't explicitly force it to appear (by holding down menu).
shareimprove this answer

여기가 좀 더 설명이 자세하다.
https://realm.io/kr/news/tmi-dismissing-keyboard-ios-android/

하지만 난 Activity내의 fragment 중 EditText로 인한 virtual keyboard를
App 시작 시점부터 띄위지 않도록 하기 위한 방법을 찾던지라
위 방법은 내가 원한 상황에서 적용되기는 어려웠음.

결국 찾아낸 방법은 다음과 같다.

EditText가 아닌 다른 item에 focus를 주어 Virtual Keyboard를 띄우지 않는 방법

http://stackoverflow.com/a/1662088


1419down voteaccepted
Excellent answers from Luc and Mark however a good code sample is missing:
<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext" 
    android:nextFocusLeft="@id/autotext"/>
shareimprove this answer


좀 예제가 일반적이지는 않아 나의 경우를 말하면
EditText의 다른 item에 android:focusable="true", android:focusableInTouchMode="true"를 주어
EditText에 focus가 가지 않도록 하여 virtual keyboard를 자동으로 띄우지 않도록 하였음.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true">

.........
                    <EditText
                        android:id="@+id/insert_entry_title"
                        android:layout_width="fill_parent"
                        android:layout_height="32dp"

2017년 1월 3일 화요일

PreferenceFragment, PreferenceFragmentCompat

꽤나 오래전에 만들었던 App에서
PreferenceFragment를 사용하여 앱 설정을 만들었었으나
나중에 android support library를 사용하여 android.support.v4.app.Fragment를 상속하여 view들을 만들어 관리 했었는데 android.app.Fragment를 상속하여 만든 PreferenceFragment를 사용하는데 문제가 있어 대충 귀찮아서 그냥 상위 버전의 support library로 업데이트 하여 사용했던 적이 있었음. (좀 후회됨....)

이 상황은 android support library v7의 PreferenceFragmentCompat를 사용하면 된다.

PreferenceFragmentCompat


Preference API Guide


위 링크에서는 PreferenceFragment를 사용하고 있으나 이를 android.support.v7.preference.PreferenceFragmentCompat 변경해서 사용해야 함.

또한 다른 점으로
PreferenceFragment은 OnCreate()가 처음 호출되어 preference page를 구성하지만  PreferenceFragmentCompat은 onCreatePreferences()가 처음 호출 되므로 onCreatePreferences()에서 page를 구성해야 한다.

Gradle Build Script Dependency

그리고 해당 preference andorid support libary를 사용하고자 할 경우
아래 링크에서 Gradle 빌드 스크립트 종속성 식별자를 정확하게 App의 project structure > dependency 에 입력하여 추가하여 사용해야 한다. 그냥 대충 검색하니 안나오더라..


v7 Preference 지원 라이브러리

preference 패키지는 사용자가 UI 설정을 수정하도록 CheckBoxPreference 및 ListPreference와 같은 기본 설정 객체 추가를 지원하는 API를 제공합니다.
v7 Preference 라이브러리는 Preference.OnPreferenceChangeListener 및 Preference.OnPreferenceClickListener와 같은 인터페이스와 CheckBoxPreference 및 ListPreference와 같은 클래스에 대한 지원을 추가합니다.
이 라이브러리에 대한 Gradle 빌드 스크립트 종속성 식별자는 다음과 같습니다.
com.android.support:preference-v7:24.2.0

No resource found that matches the given name (at 'id' with value '@android:id/list_container')

혹시나 빌드 중 위와 같은 에러가 발생한다면
임시 방편으로 아래 링크 마지막에서 언급된 것 처럼 app의 compileSdkVersion을 24 (7.0)로 설정하면 빌드 된다.





2017년 1월 1일 일요일

계산기 구현 중 '%' 처리

계산기를 구현하던 중
'%' operator의 동작이 좀 이해가 되지 않았음.

사실 %키를 사용해봤던 적이 없어서 그런지도 모르겠지만
그냥 생각으로는 백분율을 계산하는 unary operator로 생각을 했었음.

예를 들면 3% => 0.03

하지만 다음과 같은 수식에서는 앞의 숫자를 기반해서 계산 해야 한다.

100 + 5% = 105
3 + 3% = 3.09

그냥 쉽게 Sale 시 할인된 물건값을 계산할 때 사용하는 키라고 생각하면 될 듯함.

생각보다 쉽지 않음.

X @ Y %
is entered
if @ is + the RESULT should be X + ( Y percent of X )
if @ is – the RESULT should be X – ( Y percent of X )
if @ is * the RESULT should be ( Y percent of X )
if @ is / the RESULT should be X / ( Y percent of X )

x*y% = x*y/100
x/y% = x/(y/100)


참고 링크
: https://blogs.msdn.microsoft.com/oldnewthing/20080110-00/?p=23853

2016년 12월 27일 화요일

[Links] OOP, OOAD 참고 링크, 책들.

설명을 해줘야 하는데 자료 만들기는 좀 그렇고 링크로 대체함.

객체 지향 개념


객체-지향 프로그래밍 이란 무엇인가? (OOP)
 : http://vandbt.tistory.com/10

객체-지향 프로그래밍 이란 무엇인가? : 다섯개의 기반 개념
 : http://vandbt.tistory.com/39

객체지향 개념 (쫌 아는체 하기)
 : http://www.slideshare.net/plusjune/ss-46109239

Object Oriented Analysis & Design Tutorial
 : http://www.tutorialspoint.com/object_oriented_analysis_design/index.htm

사실 책은 뭘 봐야 할지 모르겠지만
C++, Java, C# 책 중에서 객체지향에 대해서 자세히 언급하는 책을 찾아서 보면 도움이 될 듯함.

이 책이 눈에 뛰던데 대체로 중급정도 서적으로 보이고 평이 좋더라..

객체지향의 사실과 오해 : 역할, 책임, 협력 관점에서 본 객체지향 
조영호 저 | 위키북스
http://www.yes24.com/24/goods/18249021
다만 개념서라서 코드는 전혀 없다. 객체지향에 대한 기초부터 차근차근 설면하고 있지만 글이 너무 많다. 인문계생을 위한 객체지향 서적 같다 ㅎ

그리고 대충 언어에 대한 기본 문법이 익숙해지고 프로그램을 몇번 짜고 나면
언어의 고급 feature에 대해서 논하는 책을 꼭 읽어보는게 좋더라.

나는 C/C++ 기반의 프로그램을 주로 짰었기 때문에 아래 책이 큰 도움이 되었고
C++의 중급문법에 눈을 뜨게 되었었다. 다른 언어에 대해서도 비슷한 책들이 있으니 꼭 참고하는 것이 언어 이해 및 고급 문법을 활용하는데 필수 적이다.

Effective C++ 이펙티브 C++ 3판 
스콧 마이어스 저/곽용재 역 | 프로텍미디어
 : http://www.yes24.com/24/goods/17525589

Effective Modern 이펙티브 모던 C++ 
스콧 마이어스 저/류광 역 | 인사이트(insight)
 : http://www.yes24.com/24/goods/20288684
(이건 보지는 않았는데.. 뭐 믿고 보는 마이어스 아저씨 책이라...)

고급 객체지향 프로그래밍http://m.yes24.com/Goods/Detail/23308041?acode=101
서점에거 살짝 봤는데 교재로 쓰면 좋을 것 같다. 초중급 난이도로 두루두루 내용을 다루고 있어 읽어두면 좋을 책.

UML & Design Pattern


OOP 개념 소개 되면 자연스레 Design pattern도 함께 소개 되어야 할 것 같은데..
워낙 유명한 GoF 책은 언어도 언어고 중급 이상이라..
한글로 된 다른 책들을 읽는게 도움이 될 듯하다.

먼저 대충 UML에 대한 이해는 아래 고전?만 보고 필요할때 찾아 보면 문제가 없는 듯 하다.

UML 실전에서는 이것만 쓴다 : Java 프로그래머를 위한 UML 개정판 
로버트 C. 마틴 저/이용원,정지호 공역 | 인사이트(insight) | 원제 : UML for Java Programmers (2003)
http://www.yes24.com/24/Goods/4492519

Design pattern은 레퍼런스 하기에는 아래 책이 괜찮았던 것 같다.
Java로 소개되어 있지만 어차피 언어는 비슷비슷해서...

Java 언어로 배우는 디자인 패턴 입문 개정판 
Yuki Hiroshi 저/이규흥 역 | 영진닷컴
 : http://www.yes24.com/24/goods/2918928

이 책은 뭐.. 호불호가 많이 갈려서 나도 사실은 읽지는 않았음.

Head First Design Patterns : 스토리가 있는 패턴 학습법  강력추천 
에릭 프리먼 등저 / 서환수 역 | 한빛미디어
 : http://www.yes24.com/24/goods/1778966

이책은 도서관에서 잠깐 봤는데 구성이나 설명이 깔끔하진 않지만 Design pattern부터 리팩토링 까지 고루 다루고 있어서 초중급자에게 적당하지 않을까 생각함.
당연히 언급되는 책들은 다 찾아봐야함.

개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 
최범균 저 | 인투북스
 : http://www.yes24.com/24/goods/9179120


Refactoring


그리고 이책은 두고두고 봐도 좋은 책 같다.

리팩토링 : 코드 품질을 개선하는 객체지향 사고법 
마틴 파울러 저/김지원 역 | 한빛미디어 | 원서 : Refactoring (Addison-Wesley Professional; 1 edition, 1999)
 : http://www.yes24.com/24/goods/7951038


소프트웨어 악취를 제거하는 리팩토링 : 구조적 설계 문제를 풀어내는 최선의 실천법!
: http://m.yes24.com/Goods/Detail/23502724
이런 책도 있음. 안봐서 모르지만 책이 작아서 후루룩 볼만한 내용. 다만 생각하느라 머리는 터질듯


마지막으로 프로그래머 추천 도서 라고 구글링을 해보면
많은 링크들이 나오는데 그것들을 참고해서 하나씩 보는 것도 괜찮다.
특히나 프로그래밍, 알고리즘 등 기술 도메인에 관련 된 책 말고
전반적인 CS/SE 관련 책을 보는 것도 나중에 큰 도움이 되더라.

다음의 링크에서 나열된 책들이 내 의견과 대부분 맞아 권함.
http://m.blog.naver.com/kkpa1002/20116446240

2016년 12월 17일 토요일

[Link] 후위 표기법(postfix) 및 계산

후위 표기법을 사용할 일이 있어서 찾다 보니 아래 사이트를 참고하게 됨. 

주로 참고한 사이트
http://interactivepython.org/runestone/static/pythonds/BasicDS/InfixPrefixandPostfixExpressions.html

설명이 영어고 예제가 python이지만
설명이 자세하고 코드가 정말 깔끔해서 참고하기 좋음.

보관을 위해 코드를 퍼오면 다음과 같음.
일단 트리를 사용해서 구현한 코드는 아님.

infix => postfix

from pythonds.basic.stack import Stack
def infixToPostfix(infixexpr):
    prec = {}
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1
    opStack = Stack()
    postfixList = []
    tokenList = infixexpr.split()
    for token in tokenList:
        if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":
            postfixList.append(token)
        elif token == '(':
            opStack.push(token)
        elif token == ')':
            topToken = opStack.pop()
            while topToken != '(':
                postfixList.append(topToken)
                topToken = opStack.pop()
        else:
            while (not opStack.isEmpty()) and \
               (prec[opStack.peek()] >= prec[token]):
                  postfixList.append(opStack.pop())
            opStack.push(token)
    while not opStack.isEmpty():
        postfixList.append(opStack.pop())
    return " ".join(postfixList)
print(infixToPostfix("A * B + C * D"))
print(infixToPostfix("( A + B ) * C - ( D - E ) * ( F + G )"))

postfix 계산

from pythonds.basic.stack import Stack
def postfixEval(postfixExpr):
    operandStack = Stack()
    tokenList = postfixExpr.split()
    for token in tokenList:
        if token in "0123456789":
            operandStack.push(int(token))
        else:
            operand2 = operandStack.pop()
            operand1 = operandStack.pop()
            result = doMath(token,operand1,operand2)
            operandStack.push(result)
    return operandStack.pop()
def doMath(op, op1, op2):
    if op == "*":
        return op1 * op2
    elif op == "/":
        return op1 / op2
    elif op == "+":
        return op1 + op2
    else:
        return op1 - op2
print(postfixEval('7 8 + 3 2 + /'))

대충 C#으로 옮겨본 코드.. 뭐 만들다 만거라 문제는 많음.
https://github.com/hallower/dumbCalculator/blob/master/CalculatorImpl/CalculatorImpl/CalculatorImpl.cs


그리고 한글로 전반적인 내용과
C++로 구현된 예제가 괜찮은 사이트 이고
트리를 사용하여 구현한 코드임.
http://ehclub.co.kr/1258

2016년 12월 13일 화요일

C# 인덱서(Indexer)

그냥 개인적으로 reference 하기 위해 copy & paste 한 내용입니다. 자세한 내용은 아래 링크를 참고하세요.
: https://msdn.microsoft.com/ko-KR/library/6x16t2tx.aspx


용도가 뭘까 궁금해서 찾아봄.
그냥 배열 같이 사용하고 싶은 stroage class에 적용해서 사용하면 편할 듯.


 인덱서에서는 클래스나 구조체의 인스턴스를 배열처럼 인덱싱할 수 있습니다. 인덱서는 해당 접근자가 매개 변수를 사용한다는 점을 제외하면 속성과 유사합니다.


인덱서는 클라이언트 응용 프로그램에서 배열과 마찬가지 방식으로 액세스할 수 있는 클래스, 구조체 또는 인터페이스를 만들 수 있게 해 주는 편리한 구문입니다. 인덱서는 주로 내부 컬렉션 또는 배열을 캡슐화하기 위한 형식에서 가장 많이 구현됩니다. 예를 들어 24시간 동안 10번 기록되는 온도를 화씨로 나타내는 TempRecord라는 클래스가 있다고 가정합니다. 클래스에는 온도를 나타내는 float 형식의 "temps"라는 배열과 온도를 기록한 날짜를 나타내는 DateTime이 들어 있습니다. 이 경우 인덱서를 구현하면 클라이언트는 float temp = tr.temps[4] 대신 float temp = tr[4]로 TempRecord 인스턴스의 온도에 액세스할 수 있습니다. 인덱서 표기법은 클라이언트 응용 프로그램의 구문을 단순하게 할 뿐 아니라 클래스와 해당 클래스의 용도를 다른 개발자가 쉽게 이해할 수 있도록 합니다.
클래스나 구조체에 대한 인덱서를 선언하려면 다음 예제에서와 같이 this 키워드를 사용합니다.
public int this[int index]    // Indexer declaration  
{  
    // get and set accessors  
}  
  

그나마 그럴듯한 예제.

class TempRecord
{
    // Array of temperature values
    private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 
                                            61.3F, 65.9F, 62.1F, 59.2F, 57.5F };

    // To enable client code to validate input 
    // when accessing your indexer.
    public int Length
    {
        get { return temps.Length; }
    }
    // Indexer declaration.
    // If index is out of range, the temps array will throw the exception.
    public float this[int index]
    {
        get
        {
            return temps[index];
        }

        set
        {
            temps[index] = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        TempRecord tempRecord = new TempRecord();
        // Use the indexer's set accessor
        tempRecord[3] = 58.3F;
        tempRecord[5] = 60.1F;

        // Use the indexer's get accessor
        for (int i = 0; i < 10; i++)
        {
            System.Console.WriteLine("Element #{0} = {1}", i, tempRecord[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();

    }
}
/* Output:
        Element #0 = 56.2
        Element #1 = 56.7
        Element #2 = 56.5
        Element #3 = 58.3
        Element #4 = 58.8
        Element #5 = 60.1
        Element #6 = 65.9
        Element #7 = 62.1
        Element #8 = 59.2
        Element #9 = 57.5
    */

 이렇도 사용 가능.

public Customer this[long id] => store.LookupCustomer(id);  
  


interface에서 인덱서를 선언할 수 있습니다. 인터페이스 인덱서의 접근자와 클래스 인덱서의 접근자는 다음과 같은 차이점이 있습니다.
  • 인터페이스 접근자는 한정자를 사용하지 않습니다.
  • 인터페이스 접근자에는 본문이 없습니다.
따라서 접근자의 목적은 인덱서가 읽기/쓰기, 읽기 전용 또는 쓰기 전용인지 여부를 나타내는 것입니다.


public interface ISomeInterface
{
    //...

    // Indexer declaration:
    string this[int index]
    {
        get;
        set;
    }
}


인덱서 특징은

  • 인덱서를 사용하면 배열과 유사한 방식으로 개체를 인덱싱할 수 있습니다.
  • get 접근자는 값을 반환합니다. set 접근자는 값을 할당합니다.
  • this 키워드는 인덱서를 정의하는 데 사용됩니다.
  • value 키워드는 set 인덱서에서 할당하는 값을 정의하는 데 사용됩니다.
  • 인덱서는 정수 값으로 인덱싱될 필요가 없으며, 특정 조회 메커니즘을 정의하는 방법을 결정해야 합니다.
  • 인덱서는 오버로드될 수 있습니다.
  • 예를 들어 인덱서는 2차원 배열에 액세스하는 경우 둘 이상의 정식 매개 변수를 사용할 수 있습니다.


인덱서는 속성과 비슷합니다. 다음 표에 나와 있는 차이점을 제외하면 접근자에 정의된 모든 규칙이 인덱서 접근자에도 적용됩니다.
Property인덱서
공용 데이터 멤버인 것처럼 메서드를 호출할 수 있습니다.개체 자체의 배열 표기법을 사용하여 개체의 내부 컬렉션 요소에 액세스할 수 있습니다.
단순한 이름을 통해 액세스할 수 있습니다.인덱스를 통해 액세스할 수 있습니다.
정적 또는 인스턴스 멤버가 될 수 있습니다.인스턴스 멤버여야 합니다.
속성의 get 접근자에는 매개 변수가 없습니다.인덱서의 get 접근자는 인덱서와 동일한 정식 매개 변수 목록을 가집니다.
속성의 set 접근자에는 명시적인 value 매개 변수가 포함됩니다.인덱서의 set 접근자는 value 매개 변수 외에도 인덱서와 동일한 정식 매개 변수 목록을 가집니다.
자동으로 구현된 속성이 있는 약식 구문을 지원합니다.약식 구문을 지원하지 않습니다.

2016년 12월 11일 일요일

Xamarin Android 개발 시 에러(Method 'Android.Support.V4.Widget.DrawerLayout.AddDrawerListener' not found.) 발생 시

Xamarin.form으로 Android app 개발 시 아래 exception이 발생 되면

 System.MissingMethodException: Method 'Android.Support.V4.Widget.DrawerLayout.AddDrawerListener' not found.

1. Nuget manager에서 업데이트가 필요한 package가 있다면 업데이트

모두 업데이트 해보고 clean & build 후 설치된 기존 앱을 지우고 다시 설치해보고
excpetion이 다시 발생한다면 2번 방법을 사용

2. 이미 모두 업데이트 되어 있다면 아래 링크의 방법을 사용해서 특정 버전으로 설치

: https://forums.xamarin.com/discussion/77924/missingmethodexception-android-support-v4-widget-drawerlayout-adddrawerlistener-not-found

임시 방편인것 같지만 일단 사용하니 정상 동작함. 답변만 첨부하자면


JamesMontemagnoJamesMontemagnoJames Montemagno ANSWER ✓
So I just reproduced your issue and I am sorry that you and other ran into this. It looks like there was an issue in the templates and I am working with the team to quickly resolve this.
To fix:
  • Simply right click on the android project and select "Manage Nuget Packages"
  • Go to Updates
  • Find Xamarin.Android.Support.v7.AppCompat
  • Select version 23.3.0 from the version picker and hit Install
  • You additionally will need to install the RecyclerView 23.3.0 NuGet Package. Go to Browse and search for: Xamarin.Android.Support.v7.RecyclerView and make sure to pick 23.3.0 to install for the correct version
  • Now do a full clean/rebuild and it should work
  • This should install the correct versions of everything you need for Android
 
3. 설치된 앱을 삭제하고 재 설치

답변에서 빠진게 있었는데 기존 설치되었다면 해당 app을 지우고 다시 설치해야 한다.
안그러면 다른 exception이 발생된다.