'Programming/Android'에 해당되는 글 11건
- 2015.09.17 Fragment에서 ListView 갱신시
- 2015.07.23 [Android Studio] Android Project를 Jar파일 만들기
- 2014.12.03 [Error] parseSdkContent failed Could not initialize class android.graphics.Typeface 라고 뜨면서 xml 불량 될때
- 2014.07.01 예전처럼 프로젝트 생성하기(킷캣SDK에서 프로젝트 생성하기) 2
- 2014.02.06 [android] SlidingMenu와 Fragment를 이용해 기본 메뉴 구조 구현하기(jfeinstein10오픈소스) 21
- 2014.01.20 [android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) 8
- 2013.07.31 TouchEvent 중 Action_Down은 되는데 Action_Move가 안될때
- 2013.07.31 CustomVIew(MyView)에서 TouchEvent(Move, Zoom in/out)
- 2013.06.22 Unable to resolve target 'android-8' 에러 났을때
- 2012.07.27 알람(Alarm)을 통한 새로운 액티비티(Activity) 열기 2
Fragment안에 있는 ListView를 갱신해야하는데,
notifyDataSetChanged();
을 써라, runOnUiThread를 써라등 다 적용했지만 되지 않았다.
그러다 찾은 overflow글
ListView의 getView 함수에서 v==null의 범위를 바꾸니까 적용된다. 다른거 다 안써도.
처음 부를때만 불려서 그런거라는데 아직 잘 이해는 되지 않는다.
참고 글은 아래에 있다.
http://stackoverflow.com/questions/15242087/notifydatasetchange-not-working
'Programming > Android' 카테고리의 다른 글
[Android Studio] Android Project를 Jar파일 만들기 (0) | 2015.07.23 |
---|---|
[Error] parseSdkContent failed Could not initialize class android.graphics.Typeface 라고 뜨면서 xml 불량 될때 (0) | 2014.12.03 |
예전처럼 프로젝트 생성하기(킷캣SDK에서 프로젝트 생성하기) (2) | 2014.07.01 |
[android] SlidingMenu와 Fragment를 이용해 기본 메뉴 구조 구현하기(jfeinstein10오픈소스) (21) | 2014.02.06 |
[android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) (8) | 2014.01.20 |
'Programming > Android' 카테고리의 다른 글
Fragment에서 ListView 갱신시 (0) | 2015.09.17 |
---|---|
[Error] parseSdkContent failed Could not initialize class android.graphics.Typeface 라고 뜨면서 xml 불량 될때 (0) | 2014.12.03 |
예전처럼 프로젝트 생성하기(킷캣SDK에서 프로젝트 생성하기) (2) | 2014.07.01 |
[android] SlidingMenu와 Fragment를 이용해 기본 메뉴 구조 구현하기(jfeinstein10오픈소스) (21) | 2014.02.06 |
[android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) (8) | 2014.01.20 |
[Error] parseSdkContent failed Could not initialize class android.graphics.Typeface 라고 뜨면서 xml 불량 될때
안드로이드 5.0 SDK를 업데이트 후,
Eclipse에서 이런 에러가 자주 나옵니다.
에러가 뜨기 시작하면 xml에서 자동완성 기능이 불량이 되서
저를 미치게 만들죠.
이럴 때 가장 간단한 해결 방법은
1. Eclipse를 종료한다.
2. User폴더로 가시면 .android라는 폴더가 있습니다.
(C: -> Users -> name -> .android)
3. .android를 삭제 & Eclipse 실행
하면 이제 에러 없이 정상 작동합니다.
하지만 이건 일시적인 방법으로 다른 프로젝트를 import한다거나 할때마다 자꾸 뜨더라구요 ㅠㅡㅠ
15년 4월 1일 수정
중요한 사실을 알았습니다. 일시적인 방법이 아니라 확실한 방법입니다.
이게 뜨는 원인은 안드로이드 5.0부터 이클립스측이 지원을 안해서 호환 문제로 인한 것이라고 하네요.
SDK매니저로 들어가서 Android 5.0을 제외한 나머지 SDK를 삭제하면 더이상 이 에러를 볼 수 없을 것입니다.
'Programming > Android' 카테고리의 다른 글
Fragment에서 ListView 갱신시 (0) | 2015.09.17 |
---|---|
[Android Studio] Android Project를 Jar파일 만들기 (0) | 2015.07.23 |
예전처럼 프로젝트 생성하기(킷캣SDK에서 프로젝트 생성하기) (2) | 2014.07.01 |
[android] SlidingMenu와 Fragment를 이용해 기본 메뉴 구조 구현하기(jfeinstein10오픈소스) (21) | 2014.02.06 |
[android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) (8) | 2014.01.20 |
어느날부터 프로젝트를 생성할때마다
안보이던 것들이 자꾸 생기기 시작했습니다.
appcompat_v7과 fragment_main.xml
얘네 뭐냐고요 ㅠㅠ
온갖 방법을 동원해보고, 알아보다가
예전처럼 Mainactivity만 있는 프로젝트를 생성하는 법을 터득해서 포스트합니다.
먼저 프로젝트를 생성합니다.
단! 여기서
중요 포인트1
MinimumSDK버전을 API19, 즉 킷캣으로 바꿔줍니다.
이렇게 해야지 appcompat_v7폴더가 생성되지 않습니다.
그리고 계속 Next를 하다보면
마지막부분에서
중요 포인트2
Fragment Layout Name을 Layout Name과 똑같이 바꿔줍니다.
저의 경우
fragment_main => activity_main 으로 바꿨습니다.
이렇게 하면 fragment_main이 생성되지 않습니다.
이제 프로젝트를 만들면,
accompt_v7폴더와 fragment_main이 보이지 않을 것입니다.
하지만 아직 할일이 남았으니!!
중요 포인트3
MainActivity의 에러나는 if문을 삭제 해주세요.
그래야 에러가 사라집니다.
중요 포인트4
AndroidManifest.xml의 android:minSdkVersion을 낮춰주세요.
최소버전이 너무 높으면 아패를 볼 수 있으니, 14정도면 적당할겁니다.
이상 4가지를 모두 하시면
그리웠던 예전의 단순한 프로젝트를 보실 수 있을 겁니다.
그럼 즐코딩 하시길!~
'Programming > Android' 카테고리의 다른 글
[Android Studio] Android Project를 Jar파일 만들기 (0) | 2015.07.23 |
---|---|
[Error] parseSdkContent failed Could not initialize class android.graphics.Typeface 라고 뜨면서 xml 불량 될때 (0) | 2014.12.03 |
[android] SlidingMenu와 Fragment를 이용해 기본 메뉴 구조 구현하기(jfeinstein10오픈소스) (21) | 2014.02.06 |
[android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) (8) | 2014.01.20 |
TouchEvent 중 Action_Down은 되는데 Action_Move가 안될때 (0) | 2013.07.31 |
오늘은 저번에 참고했던 SlidingMenu를 이용해서,
기본적인 앱 구조를 구현 코드입니다.
예제 소스를 돌려도 실제로 제가 돌리기 위한 소스를 만들기까지는
한참 시간이 걸리기때문에 포스팅합니다.
이를 이용하기 위해서는 사전 작업이 필요한데,
안보신분은
를 먼저 해보시고 오는걸 추천드립니다.
새 프로젝트를 SlidingSimpleSample로만들고,
저번에 이용했던, library를 참조합니다.
추가했더니 또
Found 2 versions of android-support-v4.jar in the dependency list,
라는 경고가 뜨네요.
이미 설명했던 것이니, 가볍게 libs폴더에 있는
android-support-v4.jar
를 삭제해버렷!
이제 필요한 자바파일입니다.
BaseActivity.java
적용시켰던 ExampleListActivity에서 수정했습니다.
package com.example.slidingsimplesample; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.ListFragment; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity; public class BaseActivity extends SlidingFragmentActivity { protected ListFragment mFrag; public BaseActivity() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // set the Behind View setBehindContentView(R.layout.menu_frame); if (savedInstanceState == null) { FragmentTransaction t = this.getSupportFragmentManager().beginTransaction(); mFrag = new MenuListFragment(); t.replace(R.id.menu_frame, mFrag); t.commit(); } else { mFrag = (ListFragment)this.getSupportFragmentManager().findFragmentById(R.id.menu_frame); } // customize the SlidingMenu SlidingMenu sm = getSlidingMenu(); sm.setShadowWidthRes(R.dimen.shadow_width); sm.setShadowDrawable(R.drawable.shadow); sm.setBehindOffsetRes(R.dimen.slidingmenu_offset); sm.setFadeDegree(0.35f); sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: toggle(); return true; } return super.onOptionsItemSelected(item); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.main, menu); return true; } public void fragmentReplace(int reqNewFragmentIndex) { Fragment newFragment = null; newFragment = getFragment(reqNewFragmentIndex); final FragmentTransaction transaction = getSupportFragmentManager() .beginTransaction(); transaction.replace(R.id.fragment_mainContainer, newFragment); getSlidingMenu().showContent(); transaction.commit(); } private Fragment getFragment(int idx) { Fragment newFragment = null; switch (idx) { case 0: newFragment = new Fragment1(); break; case 1: newFragment = new Fragment2(); break; case 2: newFragment = new Fragment3(); break; default: break; } return newFragment; } }
MainActivity.java
메인 액티비티입니다.
package com.example.slidingsimplesample; import android.os.Bundle; public class MainActivity extends BaseActivity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentReplace(0); } }
MenuListFragment.java
메뉴에 있는 아이템을 실질적으로 채워주는 부분입니다.
package com.example.slidingsimplesample; import android.content.Context; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class MenuListFragment extends ListFragment { public MenuListFragment(){ } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.list, null); } public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); SampleAdapter adapter = new SampleAdapter(getActivity()); adapter.add(new SampleItem("Fragment1", android.R.drawable.ic_menu_search)); adapter.add(new SampleItem("Fragment2", android.R.drawable.ic_menu_search)); adapter.add(new SampleItem("Fragment3", android.R.drawable.ic_menu_search)); setListAdapter(adapter); } private class SampleItem { public String tag; public int iconRes; public SampleItem(String tag, int iconRes) { this.tag = tag; this.iconRes = iconRes; } } public class SampleAdapter extends ArrayAdapter<SampleItem> { public SampleAdapter(Context context) { super(context, 0); } public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate( R.layout.row, null); } ImageView icon = (ImageView) convertView .findViewById(R.id.row_icon); icon.setImageResource(getItem(position).iconRes); TextView title = (TextView) convertView .findViewById(R.id.row_title); title.setText(getItem(position).tag); return convertView; } } @Override public void onListItemClick(ListView l, View v, int position, long id) { switch (position) { case 0: ((BaseActivity)getActivity()).fragmentReplace(0); break; case 1: ((BaseActivity)getActivity()).fragmentReplace(1); break; case 2: ((BaseActivity)getActivity()).fragmentReplace(2); break; } super.onListItemClick(l, v, position, id); } }
Fragment1.java
메뉴 1입니다.
package com.example.slidingsimplesample; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment1, container, false); return v; } }
Fragment2.java
메뉴 2입니다.
package com.example.slidingsimplesample; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragment2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment2, container, false); return v; } }
Fragment3.java
메뉴 3입니다.
package com.example.slidingsimplesample; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragment3 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment3, container, false); return v; } }
xml파일입니다.
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <LinearLayout android:id="@+id/fragment_mainContainer" android:layout_gravity="center_horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="center_horizontal" /> </RelativeLayout>
fragment1.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tv1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="fragment1"/> </LinearLayout>
fragment2.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tv2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="fragment2"/> </LinearLayout>
fragment3.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tv3" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="fragment3"/> </LinearLayout>
list.xml
<?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" />
menu_frame.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/menu_frame" android:layout_width="match_parent" android:layout_height="match_parent" />
row.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal" > <ImageView android:id="@+id/row_icon" android:layout_width="50dp" android:layout_height="50dp" android:padding="10dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/row_title" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center_vertical" android:padding="10dp" android:text="Medium Text" android:textAppearance="@android:style/TextAppearance.Medium" /> </LinearLayout>
다음으로 value폴더에 있는 dimens.xml 도 변경합니다.
dimens.xml
<resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> <dimen name="slidingmenu_offset">60dp</dimen> <dimen name="list_padding">10dp</dimen> <dimen name="shadow_width">15dp</dimen> <integer name="num_cols">1</integer> </resources>
마지막으로 그림자 효과에 대한 xml을 넣어야하는데 이친구는
drawable폴더에 넣어야됩니다.
shodow.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:endColor="#33000000" android:centerColor="#11000000" android:startColor="#00000000" /> </shape>
여기까지 하시고 돌려보면
다음과 같은 결과를 얻을 것입니닷!
그럼 열코딩 하시길~
밑에는 아예 세개 프로젝트를 압축해놨습니다.
import하시면 됩니다.
'Programming > Android' 카테고리의 다른 글
[Error] parseSdkContent failed Could not initialize class android.graphics.Typeface 라고 뜨면서 xml 불량 될때 (0) | 2014.12.03 |
---|---|
예전처럼 프로젝트 생성하기(킷캣SDK에서 프로젝트 생성하기) (2) | 2014.07.01 |
[android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) (8) | 2014.01.20 |
TouchEvent 중 Action_Down은 되는데 Action_Move가 안될때 (0) | 2013.07.31 |
CustomVIew(MyView)에서 TouchEvent(Move, Zoom in/out) (0) | 2013.07.31 |
안녕하세요.
앱을 개발하다가 페이스북같은 슬라이드 메뉴를 구현하고 싶었는데,
참고할 만한 오픈소스가 jfeintsein10이라는 소스가 굉장히 유명하더군요.
그래서 참고하고 싶었는데, 예제만 돌리는데 정말 힘들었습니다.
혹여나 저같은 분들이 있을까봐 포스팅합니다.
먼저 이 예제파일을 실행하기 위해서는 두가지를 다운 받아야합니다.
1. jfeinstein10 오픈소스
우리가 사용하려고 하는 오픈소스죠.
https://github.com/jfeinstein10/SlidingMenu
2. ActionBarSherlock
저도 자세한건 모르겠으나 위의 오픈소스가 이걸 사용하더군요.
다운 받은 zip들은 압축을 풀어줍니다.
이제 이클립스를 키고,
[NEW] - [other] - [Android] - [Android Project from Existing Code]를 선택
압축 풀린 Slidingmenu폴더를 선택하면
이런 식으로 나올텐데요.
두개다 추가하면 됩니다. 이때 밑에 Copyprojects into workspace는 꼭 체크해주세요.
이걸 체크해야 복사해서 추가하기때문에 원본은 그대로 있습니다.
같은 방법으로 ActionBar도 추가해보면
이런 식으로 뜹니다.
이때 다른 프로젝트들은 다 필요 없으니까 첫번째 프로젝트(actionbarsherlock)만 체크하고,
나머지는 전부 풀어줍니다.
마찬가지로 Copy projects into workspace는 체크해줍니다.
자 여기까지 하셨다면 아마 이런 결과 일겁니다.
자 이제 할 일은 서로 엮어주고 고쳐주면 됩니다.
구조는 이런식입니다.
actionbarsherlock은 라이브러리화 되서 library가 참고하고,
library 또한 라이브러리화 되서 ExamplelistActivity가 참고하는 구조입니다.
actionbarsherlock프로젝트와 library프로젝트의 properties로 들어가 Islibrary를 체크해줍니다.
(아마 되있을겁니다.)
다음, library프로젝트 Properties에서 Add버튼을 누른 후 actionbarsherlock을 추가시킵니다.
그러면 Console창에
Found 2 versions of android-support-v4.jar in the dependency list,~~~
같은 어마무시한 경고가 뜨는데 이것은 android-support-v4.jar라는 파일이 둘 다 있어서 중복된다는 소리입니다.
library프로젝트의 libs폴더에 있는 android-support-v4.jar파일을 삭제 합니다.
다음 library프로젝트의 SlidingFragmentActivity를 찾아서,
public class SlidingFragmentActivity extends FragmentActivity implements SlidingActivityBase {
이부분을
public class SlidingFragmentActivity extends SherlockFragmentActivity implements SlidingActivityBase {
으로 바꿉니다.
그럼 아마 모든 에러는 사라질 것이고
ExampleListActivity프로젝트를 실행하면,
이 화면을 보실 수 있을 겁니다.
ps. Unable to resolve target 'android-16' 류의 경고가 뜬다면 Properties에서 Buildtarget을 GoogleAPIs로 바꿔보세요.
다음에는 이 코드를 이용해서 실질적으로 사용하는 예제 소스를 준비하겠습니다.
'Programming > Android' 카테고리의 다른 글
예전처럼 프로젝트 생성하기(킷캣SDK에서 프로젝트 생성하기) (2) | 2014.07.01 |
---|---|
[android] SlidingMenu와 Fragment를 이용해 기본 메뉴 구조 구현하기(jfeinstein10오픈소스) (21) | 2014.02.06 |
TouchEvent 중 Action_Down은 되는데 Action_Move가 안될때 (0) | 2013.07.31 |
CustomVIew(MyView)에서 TouchEvent(Move, Zoom in/out) (0) | 2013.07.31 |
Unable to resolve target 'android-8' 에러 났을때 (0) | 2013.06.22 |
간만에 하려다가 여기서 막혔는데 한참 헤맸습니다.
OnTouchEvent를 override하면 처음에 이런식으로 나옵니다.
이상태로 코드를 완성하면 자주 잊는데요.
여기서
return super.onTouchEvent(event);
부분을
return true;
로 바꿔주면 됩니다.
return super.onTouchEvent(event)는 false값을 return하게 되는데 그렇게 되면
ACTION_MOVE, ACTION_UP을 불러 올 수 없다고 그러네요
'Programming > Android' 카테고리의 다른 글
[android] SlidingMenu와 Fragment를 이용해 기본 메뉴 구조 구현하기(jfeinstein10오픈소스) (21) | 2014.02.06 |
---|---|
[android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) (8) | 2014.01.20 |
CustomVIew(MyView)에서 TouchEvent(Move, Zoom in/out) (0) | 2013.07.31 |
Unable to resolve target 'android-8' 에러 났을때 (0) | 2013.06.22 |
알람(Alarm)을 통한 새로운 액티비티(Activity) 열기 (2) | 2012.07.27 |
처음에 직접 하다가 zoom에서 막혔는데,
stackover flow보니까 잘 설명해놓은게 있네요 ㅎㅎ
영어만 있길래 한글로 옮겼습니다.
MainActivity
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new TouchExampleView(this,null,0)); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
TouchExampleView
public class TouchExampleView extends View { private Drawable mIcon; private float mPosX; private float mPosY; private float mLastTouchX; private float mLastTouchY; private static final int INVALID_POINTER_ID = -1; private ScaleGestureDetector mScaleDetector; private float mScaleFactor = 1.f; // The ‘active pointer’ is the one currently moving our object. private int mActivePointerId = INVALID_POINTER_ID; public TouchExampleView(Context context) { this(context, null, 0); } public TouchExampleView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TouchExampleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mIcon = context.getResources().getDrawable(R.drawable.ic_launcher); mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(), mIcon.getIntrinsicHeight()); mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.translate(mPosX, mPosY); canvas.scale(mScaleFactor, mScaleFactor); mIcon.draw(canvas); canvas.restore(); } @Override public boolean onTouchEvent(MotionEvent ev) { // Let the ScaleGestureDetector inspect all events. mScaleDetector.onTouchEvent(ev); final int action = ev.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { final float x = ev.getX(); final float y = ev.getY(); mLastTouchX = x; mLastTouchY = y; mActivePointerId = ev.getPointerId(0); break; } case MotionEvent.ACTION_MOVE: { final int pointerIndex = ev.findPointerIndex(mActivePointerId); final float x = ev.getX(pointerIndex); final float y = ev.getY(pointerIndex); // Only move if the ScaleGestureDetector isn't processing a gesture. if (!mScaleDetector.isInProgress()) { final float dx = x - mLastTouchX; final float dy = y - mLastTouchY; mPosX += dx; mPosY += dy; invalidate(); } mLastTouchX = x; mLastTouchY = y; break; } case MotionEvent.ACTION_UP: { mActivePointerId = INVALID_POINTER_ID; break; } case MotionEvent.ACTION_CANCEL: { mActivePointerId = INVALID_POINTER_ID; break; } case MotionEvent.ACTION_POINTER_UP: { final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; final int pointerId = ev.getPointerId(pointerIndex); if (pointerId == mActivePointerId) { // This was our active pointer going up. Choose a new // active pointer and adjust accordingly. final int newPointerIndex = pointerIndex == 0 ? 1 : 0; mLastTouchX = ev.getX(newPointerIndex); mLastTouchY = ev.getY(newPointerIndex); mActivePointerId = ev.getPointerId(newPointerIndex); } break; } } return true; } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { mScaleFactor *= detector.getScaleFactor(); // Don't let the object get too small or too large. mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f)); invalidate(); return true; } } }
'Programming > Android' 카테고리의 다른 글
[android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) (8) | 2014.01.20 |
---|---|
TouchEvent 중 Action_Down은 되는데 Action_Move가 안될때 (0) | 2013.07.31 |
Unable to resolve target 'android-8' 에러 났을때 (0) | 2013.06.22 |
알람(Alarm)을 통한 새로운 액티비티(Activity) 열기 (2) | 2012.07.27 |
Eclipse 안드로이드 파일, 핸드폰 단말기에서 실행하기. (0) | 2012.06.25 |
다른 곳에서 멀쩡하게 돌아가던 프로젝트를 import를 했는데,
Unable to resolve target 'android-8'
라는 에러와 함께 빨간줄 천지를 본적이 있을 것이다.
이는 이전 프로젝트와의 Build Target이 달라서 일어나는 것.
Project - Properties - Android - BuildTarget
을 설정하면 해결 된다.
스크린샷 1
스크린샷 2
이렇게 하면 대부분 해결 될 것이다.
'Programming > Android' 카테고리의 다른 글
[android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) (8) | 2014.01.20 |
---|---|
TouchEvent 중 Action_Down은 되는데 Action_Move가 안될때 (0) | 2013.07.31 |
CustomVIew(MyView)에서 TouchEvent(Move, Zoom in/out) (0) | 2013.07.31 |
알람(Alarm)을 통한 새로운 액티비티(Activity) 열기 (2) | 2012.07.27 |
Eclipse 안드로이드 파일, 핸드폰 단말기에서 실행하기. (0) | 2012.06.25 |
알람매니저를 이용해서 App을 만드려고 할 때 알람매니저를 이용한 예제들은 많았지만,
다 Notification을 실행해서 Activity를 실행하는데 꽤나 애먹었던 기억이 있기에,
main Code
버튼하나를 만들고 버튼을 누르면 3초 뒤에 알람이 울리게 하는 코드입니다.
package com.naddola.mytemp_alarmactivity; import java.util.Date; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MyTemp_AlarmActivityActivity extends Activity { MyListener myListener; Button buttonConfirm; private Intent intent; private PendingIntent ServicePending; private AlarmManager AM; //초기화과정 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myListener = new MyListener(); buttonConfirm = (Button) findViewById(R.id.Confirm); buttonConfirm.setOnClickListener(myListener); AM = (AlarmManager) getSystemService(ALARM_SERVICE); } class MyListener implements OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { case R.id.Confirm: //Receiver로 보내기 위한 인텐트 intent = new Intent(getApplicationContext(), AlarmReceiver.class); ServicePending = PendingIntent.getBroadcast( MyTemp_AlarmActivityActivity.this, 0, intent, 0); //현재 시간보다 3초뒤에 pendingIntent를 실행 Date t = new Date(); t.setTime(java.lang.System.currentTimeMillis() + 3 * 1000); AM.set(AlarmManager.RTC_WAKEUP, t.getTime(), ServicePending); Toast.makeText(getBaseContext(), "3초뒤에 알람", Toast.LENGTH_SHORT).show(); break; } } } }
Receiver Code
보내준 알람을 받아서 새로운 Activity를 실행시키는 코드입니다.
package com.naddola.mytemp_alarmactivity; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { try { intent = new Intent(context, MyActivity.class); PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT); pi.send(); } catch (CanceledException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
AlarmActivity Code
새로운 Activity 실행
package com.naddola.mytemp_alarmactivity; import android.app.Activity; import android.os.Bundle; public class MyActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alarm); } }
manifest.xml
Reciever와 새 Activity를 추가해줍니다.'Programming > Android' 카테고리의 다른 글
[android]Sliding Menu 메뉴 돌려보기(jfeinstein10오픈소스) (8) | 2014.01.20 |
---|---|
TouchEvent 중 Action_Down은 되는데 Action_Move가 안될때 (0) | 2013.07.31 |
CustomVIew(MyView)에서 TouchEvent(Move, Zoom in/out) (0) | 2013.07.31 |
Unable to resolve target 'android-8' 에러 났을때 (0) | 2013.06.22 |
Eclipse 안드로이드 파일, 핸드폰 단말기에서 실행하기. (0) | 2012.06.25 |