레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시

2021년 4월 8일 목요일

[android, java] Didn't find class "android.view.View$OnUnhandledKeyEventListener" 오류 발생

새로 테스트 프로젝트를 생성하고 실행 해 봤더니 오류가 난다.


Didn't find class "android.view.View$OnUnhandledKeyEventListener" 
라는 오류가 나는데 뭐 한것도 없는데 오류가 난다.

뭔가 버젼 쪽 설정 문제인것 같은데, 인터넷에서 검색해보니 해결책이 중구 난방이다.
정확히 뭐가 문제인지 알수가 없으니 어느것이 정확한 해결책인지도 모르겠다.


하여간 나의 경우는.

configurations.all {
resolutionStrategy.eachDependency { details ->
def requested = details.requested
if (requested.group == "androidx.appcompat") {
if (!requested.name.startsWith("multidex")) {
details.useVersion "1.+"
}
}
}
}

build.gradle 파일에 뭔가 알수 없는 문구를 추가해 주니 해결되었다.

정말 어렵다 어려워...
 


※파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

2021년 3월 31일 수요일

[android, java] "trying to draw too large bitmap" 오류가 발생할때.

앱을 만드는 중 별것 한것도 없는데 오류가 난다.


"trying to draw too large bitmap" 라는 오류가 발생하는데 이미지가 너무 크다는 오류겠지만, 리소스를 찾아보니 별로 크지도 않은데 오류가 난다. (애초에 저런 크기의 이미지 자체가 없다)

이 오류의 해결 방법을 찾아 보니 몇가지가 나오다.

가장 간단한 방법은 "하드웨어 가속을 해제하는것".

하드웨어 가속과 이미지 큰게 무슨 상관인지는 모르겠으나, "AndroidManifest.xml" 파일내 <application> 항목에  android:hardwareAccelerated="false" 한줄만 추가해 주면 간단히 해결이 된다.

하지만, 하드웨어 가속을 써야만 하는 경우라면 다른 해결법이 필요하다.

이미지가 너무 크기 때문에 발생하는 오류 (엄밀히 말하면 높은 해상도 때문) 라서 높은 해상도 파일은 높은 해상도 파일로 구분해 주면 된다.

일단 리소스 폴더인 "drawable" 의 위치를 탐색기로 연다.


기본적으로 drawable 과 drawable-v24 폴더만 있을 것인데, 여기에 drawable-xxxhdpi 폴더를 생성해 준다.

그리고 높은 해상도를 가진 파일 (일판적으로 크기가 큰 파일) 들을 여기로 이동해 준다.


그러면 안드로이드 스튜디오의 "drawable"  폴더에 각 파일들이 각각 구분되어 나오는데 "xxxhdpi" 로 구분되는 파일들은 높은 해상도를 가지고 있어서 표시가 된다.

원래는 각 해상도 별로 각각 그 폴더에 그 해상도의 이미지를 넣어줘야 정상이 겠으나...

어쨌든 대부분은 이렇게 해결이 된다. 


2019년 5월 14일 화요일

Flutter : 플러터 설치

언제나 하나의 프로그램으로 모든 장치에서 다 실행되는 꿈 같은 개발 프로그램이 나오길 기다린다.

그런 면에서 요즘 핫 한 개발툴이 플러터(Flutter).
그래서 한번 설치해 보기로 했다.

배포 사이트 : https://flutter.dev/docs/development/tools/sdk/releases#windows

배포 사이트에서 일단 SDK 를 다운 받자.


일단은 윈도우 버젼으로. 그리고 안전한 "Stable" 버젼을 다운 받자.


다운 받으면 400메가 쯤되는데, 따로 설치가 설치하지 않으므로 그냥 사용할 위치에 압축을 풀어 주면된다.

다운 받은 파일은 SDK 일 뿐이므로, 실제로는 플러터로 개발하려면 안드로이드 스튜디오 같은 별도의 개발툴을 사용해서 개발해야 한다. 여기서는 이미 설치되어 있는 "안드로이드 스튜디오" 를 사용할 예정.


압축 푼 파일에서 "flutter_console.bat" 를 실행하자.


아마 윈도우10 이면 경고 창이 뜰 것이다. 플러터 SDK 배포터는 일단 믿을 수 있는 사이트지만, 믿고 말고는 개인의 판단이니 알아서 결정하시면 되겠다. 만약 믿음으로 받아 들이고 설치를 하겠다면, 하단에 "추가 정보" 항목을 클릭해 보자.


그러면 위험함에도 불구하고 "실행" 하겠다는 버튼이 있으니, 이것으로 실행한다.


드디어 나타난 플러터 설치 창...


일단 "flutter doctor" 를 실행 시켜 현재 시스템에 플러터가 설치 가능한지를 체크한다.
일반적으로 당연히 문제가 있다고 나오니, 당황하지 않고 뭐가 문제인지 하나하나 해결 하면 된다.

문제는 나의 경우 "Unable Android SDK" 오류가 난다는것.
일반적으로는 "안드로이드 스튜디오"가 설치되어 있으면 이런 오류가 나지 않는다.


하지만, 난 이미 안드로이드 스튜디오가 설치되어 있는데?


당황하지말고, 고급 시스템 설정으로 이동하자.
이것은 안드로이드 SDK 경로가 지정되어 있지 않기 때문에 발생하는 오류이다.


여기서 "환경변수".


여기에다 "ANDROID_HOME" 항목을 추가 해주면된다.


만약 안드로이드 스튜디오를 설치한지 오래되어 안드로이드 SDK 의 경로가 생각나지 않는다면, 안드로이드 스튜디오 설정에서 찾을수 있다.


찾은 안드로이드 SDK 경로를 "ANDROID_HOME" 항목으로 등록하자.


시스템의 "path" 항목에도 해당 경로를 추가해줘야 한다는 것을 잊지 말자.


OK.

안드로이드 SDK 가 정상적으로 인식되었다.

하단에 보니 라이센스 문제가 있는가 본데, 시키는 대로 "flutter doctor --android-licenses" 라고 입력하자.


그러면 뭔가 많은 양의 텍스트가 나오는데 하나하나 읽어 보던가, 아니면 그냥 "Y" 눌러 주고 넘어가자.


이제 라이센스 문제도 해결되었고 마지막으로 안드로이드 스튜디오에 "flutter" 와 "Dart" 플러그인이 설치되어 있지 않다는 문제만 남았다.


요건 환경설정으로 이동해서...


플러그인 > flutter 검색 > flutter install.


flutter 플러그인은 Dart 프로그램 언어로 작동하므로 flutter 를 설치하면 자동으로 Dart 도 같이 설치된다. 


요렇게 설치하면 플러그인 문제는 단숨에 해결되고, 드디어 모든 문제가 해결되었다.
이걸로 flutter 설치 완료!!!

참고로 나의 경우 제일 하단의 "Connected device" 가 초록색으로 체크되어 있는데, 이것은 내 컴퓨터에 개발용 폰이 연결되어 있기 때문에 통과로 체크 된것이다. 만약 설치 컴퓨터에 개발용 폰이 연결되어 있지 않으면 노란색 경고로 체크되는데, 그렇더라도 개발에는 문제 없으니 그냥 넘어 가도 된다.


진짜로 되는가 테스트해보기 위해 안드로이드 스튜디오의 "새 프로젝트" 항목에 보면 "Start a new Flutter project" 라는 항목이 추가되어 있는 것을 볼 수 있다.


테스트용이니 일단 아무거나 선택하고...


중간에 flutter SDK 경로를 지정하는 부분이 나오는데, 이부분만 지정해 주면 나머지는 딱히 수정하지 않아도 된다.


이렇게 프로젝트를 생성하면...


쨘~~~.
flutter 프로젝트 가 만들어 졌습니다.

여기서 상단의 실행 버튼을 이용해 실행 해보자.


OK~~~
이렇게 쉽고 간단하게 flutter 프로그램을 만들 수 있다.


2017년 3월 24일 금요일

Xamarin, Android : 하위 페이지에서 상위 페이지 이동하는 액션 툴바 설정

하위 화면에서 상위 화면으로 돌아가는 아이콘 설정을 해보자.


이런거...

Xamarin, Android : 화면이동 & 이동시 애니메이션 적용 을 기준으로 설명.

일단 서브 페이지도 액션 툴바를 설정한다.
설정하는 방법은 "Action ToolBar 등록 및 메뉴 설정" 을 참고.

메인 화면에 액션툴바를 설정한 것과 동일하게 하면된다.


일단 서브 레이아웃에도 툴바를 등록해 놓고.


SubActivity 에도 툴바를 불러 온다.
메인과 다른 점이라고는 아이콘을 별도로 등록하지 않는다는 것뿐.

이렇게 하면 아이콘까지는 출력되니, 이제는 그 아이콘을 클릭하면 메인 액티비티로 이동 하는 액션을 넣는다.


OnOptionSelected() 를 오버라이드 하면 되며, 거기서 선택한 메뉴의 아이디가 "Android.Resource.Id.Home" 일 경우 실행할 항목을 작성하면 된다.

using Android.App;
using Android.Views;
using Android.OS;
using Android.Support.V7.App;
using SupportActionBar = Android.Support.V7.App.ActionBar;

namespace son10001app
{
    [Activity(Label = "SubActivity", Theme = "@style/MyTheme")]
    public class SubActivity : AppCompatActivity
    {
        private Android.Support.V7.Widget.Toolbar mToolbar;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.Sub);

            mToolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(mToolbar);
            SupportActionBar.Title = "서브 페이지";
            SupportActionBar.SetDisplayHomeAsUpEnabled(true);
        }

        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            MenuInflater.Inflate(Resource.Menu.action_menu, menu);
            return base.OnCreateOptionsMenu(menu);
        }

        public override bool OnOptionsItemSelected(IMenuItem item)
        {
            switch (item.ItemId)
            {
                case Android.Resource.Id.Home:      // action menu 의 home(<-) 클릭
                    OnBackPressed();
                    return true;
            }

            return base.OnOptionsItemSelected(item);
        }

        // 뒤로가기 버튼 클릭
        public override void OnBackPressed()
        {
            Finish();
            OverridePendingTransition(Resource.Animation.anim_slide_in_left, Resource.Animation.anim_slide_out_right);
        }
    }
}

이렇게 작성해 놓고 앱을 실행해 보면...


두개의 페이지가 각각 아이콘을 클릭함으로 페이지 전환이 된다.

Xamarin, Android : 화면이동 & 이동시 애니메이션 적용

일단 앱에서 화면 이동.

Xamarin, Android : 뒤로가기 버튼으로 종료 막기 에서 만든 앱을 기준으로함.

앱에서 화면 이동이란 액티비티 이동이니, 먼저 레이아웃을 하나 추가.



파일명은 아무거나 원하는 대로.


서브 페이지는 불러오기만 할 것이므로 그냥 이대로 놔 두면 되고...


레이아웃을 만들었으니, 그 레이아웃을 불러올 액티비티를 하나 만듬.


알아보기 쉽게 "SubActivity" 라고 만들고...


단순하게 서브 화면을 불러오는 구문만 추가.


Intent intent = new Intent(this, typeof(SubActivity));
StartActivity(intent);

그런 다음 메인 액티비티에서 불러오기만 하면 됨.
여기서는 액션바에서 검색 버튼을 클릭시 화면 전환이 되게 만듬.


그럼 이렇게 화면 전환은 된다.
그런데, 화면 전환 액션이 별로 맘에 안듬. 뭔가 화면이 따로 따로 노는 듯.
그러니, 좀더 그럴듯하게 화면 전환 애니메이션을 적용시켜 보자.

검색 아이콘을 클릭하면 현재 페이지가 왼쪽으로 이동하고, 새로운 페이지가 오른쪽에서 슬라이드 하면서 들어오게 끔 만들어 본다.


일단 "Resources" 폴더에 "anim" 폴더를 하나 만든다.


그리고, 거기에 "anim_slide_out_left.xml" 파일을 하나 만듬.
파일이름은 어떤걸 해도 상관이 없으나, 알아보기 쉽게 만든다.

fromXDelta 가 0% 고, toXDelta 가 -100% 이므로, 현재 보이는 화면이 왼쪽으로 이동하며 화면에서 완전히 사라지는 애니메이션이 된다.

이걸 현재 화면에 적용하면 현재 화면이 왼쪽으로 이동하며 사라지는 에니메이션이 된다.

그럼, 이젠 새로운 화면이 등장하는 애니메이션을 만든다.


동일한 위치에 "anim_slide_in_right.xml" 만들고, 등장하는 애니메이션이므로 사라지는 에니메이션과 반대로 fromXDelta 가 100% 고, toXDelta 가 0% 로 지정하여 오른쪽에서 왼쪽으로 이동하며 화면에 등장하게 설정한다.


그리고, 액티비티를 불러오는 부분에 "OverridePendingTansition()" 을 설정.

 OverridePendingTansition("들어오는 화면 액션", "나가는 화면 액션")

이렇게 지정하면 서브 화면으로 이동하는 애니메이션은 설정 완료.
이제 반대로 서브 화면에서 메인 화면으로 이동하는 애니메이션을 만들어 본다.



그냥 메인 화면에서 만들었던 애니메이션과 반대로 이동하게 만들면 된다.


그리고 서브 액티비티에서 뒤로가기 버튼을 클릭시 Finish(); 하는 부분에 애니메이션을 적용.

이렇게 하면...


두개의 화면이 마치 붙어 있는것처럼 자연스럽게 왔다 갔다 하며 화면 전환이 이루어 진다.