menu.xml은 다음과 같다(자바로 할때랑 마찬가지)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >
 
    <!-- 액션 버튼으로써 나타나는 "검색" 아이템  -->
    <item
        android:id="@+id/action_search"
        android:title="@string/action_favorite"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="ifRoom" />
 
    <!-- 액션 버튼으로써 나타나는 "공유" 액션 아이템 -->
    <item
        android:id="@+id/action_share"
        android:title="@string/action_cart"
        android:icon="@android:drawable/ic_menu_share"
        app:showAsAction="ifRoom" />
 
</menu>
menu.xml
cs




코틀린으로 구현할 때는 방식이 좀 다르다.


아래와 같이 하면 간단하게 구현한다.


구글링하면 다른 방법으로 한 것들도 많이 발견된다. 뭐가 베스트인지는 모르겠다




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
 
    //액션버튼 메뉴 액션바에 집어 넣기
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu, menu)
        return true
    }
 
    //액션버튼 클릭 했을 때
    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        when(item?.itemId){
            R.id.action_search -> {
                //검색 버튼 눌렀을 때
                return super.onOptionsItemSelected(item)
            }
            R.id.action_share -> {
                //공유 버튼 눌렀을 때
                return super.onOptionsItemSelected(item)
            }
            else -> return super.onOptionsItemSelected(item)
        }
    }
}
MainActivity.kt
cs




참고) 혹시 커스텀 툴바(custom toolbar)를 만들었는데 메뉴 아이템이 안들어간다면


actionbar를 설정을 안했을수도 있다. 그러면, MainActivity.kt에 다음과 같이 코드를 짜주면 된다.


액션바 코드는 타이틀을 없애주는 코드다.



 

1
2
3
4
5
//참고: 커스텀 툴바 적용하기
val toolBar = find<toolbar>(R.id.toolbar)
setSupportActionBar(toolBar)

//참고: 타이틀 없애기
val actionBar = supportActionBar
if(actionBar != null) actionBar.setDisplayShowTitleEnabled(false)
cs


기존에 findViewById는 너무 불편했다.


그래서 코틀린에서는 Kotlin Android Extension을 지원한다.


밑의 extension 부문만 추가해주면 된다.






아래는 자동으로 코드에 추가 된다.







이제 아래처럼 사용하면 된다.






'Study > Kotlin' 카테고리의 다른 글

[Kotlin 코틀린] 액션바에 버튼 추가하기  (0) 2017.12.21
[Kotlin 코틀린] Anko란??  (0) 2017.12.21

https://github.com/Kotlin/anko





Anko is a Kotlin library which makes Android application development faster and easier. It makes your code clean and easy to read, and lets you forget about rough edges of the Android SDK for Java.


라고 한다.


신기했던 거는 

toast("Hi there")

longToast("Hi there")

로 간단하게 쓸 수 있다는거!!


훨씬 더 많은 기능이 있다는 데 아직 이것밖에 안써봤다....

타겟 SDK와 최소 SDK를 어떻게 잡아야 보편적인 사용자 기기들까지 적용할 수 있을까??


답은 점유율에 있다.





minAPI를 16까지 내리게 되면 왠만한 기기들은 다 적용한다고 보면 된다.


많이 내리게 되면 그만큼 API를 많이 못쓰게 되니 불편한건 사실이다.


외부 라이브러리(오픈소스)를 많이 쓰는 수 밖에 없는 것 같다.


그리고 targetAPI는 8.0 Oreo (26) 까지 잡는게 좋은 것 같다.


Oreo는 이미 테스트를 다 맞춘 안전한 API이므로 타겟으로 잡아도 무난한 것 같다.

처음에 개발에 들어가면 아무 생각없이 layout이나 drawable, dimens, strings을 만들기 마련이다. (나만 그런가....)


그래서 이번에는 앱 스토어에 올릴려면 필수적인 확장성에 대해서 공부해볼려고 한다. (오픈소스를 많이 뒤지다 보면 많이 나오기는 한다. 하지만 정리!)




[1-1] 해상도별(drawable)





일단 https://developer.android.com/guide/practices/screens_support.html?hl=ko 을 참고하면 Android 구성 한정자는 다음과 같다.









총 주로 쓰는 건 mdpi ~ xxhdpi를 쓴다. 자세히는 잘 모르겠다.




쓰는 방법은 


(1)  adobe illustrator 에서 mdpi로 작업한 다음(http://www.kmshack.kr/2013/03/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EC%A0%9C%EC%95%88%ED%95%98%EB%8A%94-%EB%94%94%EC%9E%90%EC%9D%B8-%EB%B0%A9%EB%B2%95%EB%A1%A0-3-dpi-dipdp/ 참고)에 Asset Export를 하여 dpi별로 이미지를 가져온다.


(2) 4개를 나눠진 파일을 위 2번째 사진처럼 4개의 'drawable-XXX dpi' 에 각자 저장한다.


(3) 쓰는 방법은 4개로 나뉘어도 이름은 graphic.png로 같다. 그러므로 '@drawable/graphic' 으로 쓰면 된다.


자세한 건  https://developer.android.com/guide/practices/screens_support.html?hl=ko 를 참고하면 됩니다.









[1-2] 해상도별(layout, dimens)





Android에서 지원하는 화면 구성 한정자는 다음과 같다.


https://developer.android.com/guide/practices/screens_support.html?hl=ko (참고)




위와 같은 경우를 쓰는 경우는 테블릿을 대상으로 할때는 쓰지만 모바일만 지원하는 경우는 이렇게 잘 안쓴다고 한다. 풍문


그래서 dimens을 관리한다고 한다. 잘 모르겠다.


그냥 dp를 믿고 쓴다는 거 같다.








[2] 언어별(strings)






https://developer.android.com/training/basics/supporting-devices/languages.html?hl=ko



위 링크를 확인하면 자세히 나온다.




위와 같이 나뉘어서 저장하면



위와 같이 자동으로 분류해주고 국기까지 그려준다ㅎㅎ



이렇게 하면 사용자가 기기에서 언어설정을 어떻게 해주었냐에 따라 언어가 결정된다.


values는 디폴트로 적용된다.


(예를 들면, 사용자가 기기를 스페인어로 설정해놨는데 이 앱에서는 스페인어를 지원하지 않으므로 values에 있는 언어를 가져온다. 그러므로, values는 영어로 해주는 편이 일반적이다.)







https://m.blog.naver.com/PostView.nhn?blogId=thqkdrhks22&logNo=150130493315&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


https://nuriwiki.net/wiki/index.php/%EC%98%A4%EC%9D%BC%EB%9F%AC_%ED%94%BC_%ED%95%A8%EC%88%98



오일러 피 함수

누리위키, 온 누리의 백과사전

오일러 피 함수(Euler's phi function) 또는 오일러 파이 함수 ϕ(n)이란 어떤 자연수 n보다 작거나 같은 자연수 중에서 n과 서로소인 것의 개수를 나타내는 함수이다. 예를 들어, ϕ(8)=∣{1,3,5,7}∣=4이다. 이것을 수식으로 표현하면 다음과 같다: 

ϕ(n)=∣{aN|1an,(a,n)=1}.

성질[편집]

p는 소수라고 하자.

  • ϕ(p)=p1.
    • 역으로, ϕ(n)=n1이라면, n은 소수이다.
  • ϕ(pa)=papa1.
  • (m,n)=1이라면, ϕ(mn)=ϕ(m)ϕ(n)이다. (오일러 피 함수는 곱셈적 함수이다.)




중국인의 나머지 정리는, 어떤 수 x를 서로소인 m1, m2, m3, ..., mn으로 각각 나눴을 때 나머지가 a1, a2, a3, ..., an 이라고 할 때 x는 m1* m2 * m3 * ... * mn 의 modular 연산 안에서 해가 유일하다는 것을 말한다. 


https://librewiki.net/wiki/%EC%A4%91%EA%B5%AD%EC%9D%B8%EC%9D%98_%EB%82%98%EB%A8%B8%EC%A7%80_%EC%A0%95%EB%A6%AC


http://blog.naver.com/PostView.nhn?blogId=rym&logNo=220833505480&categoryNo=0&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView

http://codepractice.tistory.com/79




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
 
using namespace std;
 
int RecursiveEuclid(int a, int b)
{
    if (a < b)
        swap(a, b);
 
    if (a%b == 0)
        return b;
    else
        return RecursiveEuclid(b, a%b);
}
 
template<typename T>
T LoopEuclid(T a, T b)
{
    if (a < b)
        swap(a, b);
 
    while (a%b != 0)
    {
        T tmp = a;
        a = b;
        b = tmp%b;
    }
    return b;
}
 
 
template<typename T>
pair<T, T> ExtendedEuclid(T a, T b)
{
    T q = (a / b);
    T r = a%b;
    T s1, s2, t1, t2;
    s1 = 0;
    t1 = 1;
    s2 = 1;
    t2 = 0;
 
 
    while (r!=0)
    {
        T temps = s2;
        s2 = s1;
        s1 = temps - s1*q;
 
        T tempt = t2;
        t2 = t1;
        t1 = tempt - t1*q;
        
        a = b;
        b = r;
        q = (a / b);
        r = a%b;
    }
    return pair<T, T>(s1, t1);
}
 
 
 
int main()
{
    int a = 69;
    int b = 23;
    pair<intint> sol = ExtendedEuclid(a,b);
    cout << sol.first << "*" << a << "+" << b << "*" << sol.second << "=" << LoopEuclid(a, b) << endl;
    a = 67;
    b = 23;
    sol = ExtendedEuclid(a, b);
    cout << sol.first << "*" << a << "+" << b << "*" << sol.second << "=" << LoopEuclid(a, b) << endl;
}
cs


https://en.wikipedia.org/wiki/Graham_scan


Convex Hull 알고리즘은 한국말로 볼록 껍질 알고리즘이라고도 하며


여러 점 가운데서 가장 큰 볼록 다각형을 찾는 알고리즘이다.


Graham scan(+CCW) method 를 쓴다.


https://www.acmicpc.net/problem/1708


위의 문제를 풀어보면 좋을 것 같다.

퍼온곳: https://www.acmicpc.net/blog/view/27


Counter Clock Wise


세 점 P1(x1, y1), P2(x2, y2), P3(x3, y3)가 있을 떄, 점 3개를 이은 선분은 어떤 방향성을 나타내게 될까요? 11758번 문제: CCW

가능한 경우의 수는 총 3가지가 있습니다. 반시계 방향, 시계 방향, 일직선. 시계 방향을 -1, 일직선을 0, 반시계 방향을 1이라고 했을 때, P1은 검정색, P2는 초록색, P3을 파란색으로 나타내면 아래 그림과 같습니다.

세 점으로 이루어진 삼각형의 면적을 구하는 방법을 이용해서 방향성을 구할 수 있습니다. S를 점 P1, P2, P3로 이루어진 삼각형의 면적이라고 했을 때

2×S=|x1y11x2y21x3y31|=(x2x1)(y3y1)(y2y1)(x3x1)

입니다.

여기서 S의 부호에 따라서, 다음과 같이 세 가지로 나눌 수 있습니다.

  • S > 0: 반시계 방향
  • S = 0: 일직선
  • S < 0: 시계 방향

코드로 나타내면 아래와 같습니다.

int ccw(int x1, int y1, int x2, int y2, int x3, int y3) {
    int temp = x1*y2+x2*y3+x3*y1;
    temp = temp - y1*x2-y2*x3-y3*x1;
    if (temp > 0) {
        return 1;
    } else if (temp < 0) {
        return -1;
    } else {
        return 0;
    }
}



https://www.acmicpc.net/problem/11758



+ Recent posts