2015. 9. 17. 13:45



Fragment안에 있는 ListView를 갱신해야하는데,

notifyDataSetChanged();

을 써라, runOnUiThread를 써라등 다 적용했지만 되지 않았다.


그러다 찾은 overflow글

ListView의 getView 함수에서 v==null의 범위를 바꾸니까 적용된다. 다른거 다 안써도.

처음 부를때만 불려서 그런거라는데 아직 잘 이해는 되지 않는다.


참고 글은 아래에 있다.

http://stackoverflow.com/questions/15242087/notifydatasetchange-not-working

Posted by 나돌라
2015. 7. 23. 02:35

https://www.youtube.com/watch?v=1i4I-Nph-Cw


동영상대로 하니까 Jar파일 만들어진다.

Posted by 나돌라
2014. 12. 3. 14:13

안드로이드 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를 삭제하면 더이상 이 에러를 볼 수 없을 것입니다.

Posted by 나돌라
2014. 7. 1. 14:08

어느날부터 프로젝트를 생성할때마다

 안보이던 것들이 자꾸 생기기 시작했습니다.


appcompat_v7fragment_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가지를 모두 하시면

그리웠던 예전의 단순한 프로젝트를 보실 수 있을 겁니다.

그럼 즐코딩 하시길!~


Posted by 나돌라
2014. 2. 6. 15:40

오늘은 저번에 참고했던 SlidingMenu를 이용해서,

기본적인 앱 구조를 구현 코드입니다.

예제 소스를 돌려도 실제로 제가 돌리기 위한 소스를 만들기까지는

한참 시간이 걸리기때문에 포스팅합니다.


이를 이용하기 위해서는 사전 작업이 필요한데,

안보신분은 

http://naddola.tistory.com/entry/androidSliding-Menu-%EB%A9%94%EB%89%B4-%EB%8F%8C%EB%A0%A4%EB%B3%B4%EA%B8%B0jfeinstein10%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4

를 먼저 해보시고 오는걸 추천드립니다.


새 프로젝트를 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>


여기까지 하시고 돌려보면



다음과 같은 결과를 얻을 것입니닷!

그럼 열코딩 하시길~


밑에는 아예 세개 프로젝트를 압축해놨습니다.

SlidingSimpleSample.zip

import하시면 됩니다.


Posted by 나돌라
2014. 1. 20. 10:41

안녕하세요.

앱을 개발하다가 페이스북같은 슬라이드 메뉴를 구현하고 싶었는데,

참고할 만한 오픈소스가 jfeintsein10이라는 소스가 굉장히 유명하더군요.


그래서 참고하고 싶었는데, 예제만 돌리는데 정말 힘들었습니다.

혹여나 저같은 분들이 있을까봐 포스팅합니다.


먼저 이 예제파일을 실행하기 위해서는 두가지를 다운 받아야합니다.


1. jfeinstein10 오픈소스

우리가 사용하려고 하는 오픈소스죠.

https://github.com/jfeinstein10/SlidingMenu


2. ActionBarSherlock

저도 자세한건 모르겠으나 위의 오픈소스가 이걸 사용하더군요.

http://actionbarsherlock.com/




다운 받은 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로 바꿔보세요.


다음에는 이 코드를 이용해서 실질적으로 사용하는 예제 소스를 준비하겠습니다.



Posted by 나돌라
2013. 7. 31. 19:49

간만에 하려다가 여기서 막혔는데 한참 헤맸습니다.


OnTouchEvent를 override하면 처음에 이런식으로 나옵니다.

이상태로 코드를 완성하면 자주 잊는데요.

여기서

  return super.onTouchEvent(event);

부분을

  return true;

로 바꿔주면 됩니다.


  return super.onTouchEvent(event)는 false값을 return하게 되는데 그렇게 되면

ACTION_MOVE, ACTION_UP을 불러 올 수 없다고 그러네요


Posted by 나돌라
2013. 7. 31. 19:38

처음에 직접 하다가 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;
		}
	}
}
Posted by 나돌라
2013. 6. 22. 21:26

다른 곳에서 멀쩡하게 돌아가던 프로젝트를 import를 했는데,

Unable to resolve target 'android-8'

라는 에러와 함께 빨간줄 천지를 본적이 있을 것이다.


이는 이전 프로젝트와의 Build Target이 달라서 일어나는 것.


Project - Properties - Android - BuildTarget

을 설정하면 해결 된다.

 

 

스크린샷 1

 

 

스크린샷 2

 

이렇게 하면 대부분 해결 될 것이다.

 



Posted by 나돌라
2012. 7. 27. 15:18

알람매니저를 이용해서 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를 추가해줍니다.





    

    
        
            
                

                
            
        
        
        
    

Posted by 나돌라