2010년 12월 26일 일요일

[Android] TextView 긴 문장 움직여서 보여주기

 

 

 

 

 

안드로이드 개발하다보면 TextView 의 사이즈보다 Text가 더 길 경우가 생기게 됩니다

 

그럴때 특정 영역에 Text를 모두 보여줄 수 가 있는데 텍스트를 왼쪽으로 움직이면서

 

전체 Text를 보는 방법을 알아 보도록 하겠습니다.

 

사용 예)

xml의 속성값으로

 

android:singleLine="true"
android:ellipsize="marquee"
를 주고

 

자바 코드에서는

 

TextView text = (TextView)findViewById(R.id.text);
text.setSelected(true);

 

이런식으로 선택을 해줘야 합니다.

선택되어진 TextView여야 제대로 동작한다는 걸 알 수 있습니다^^

 

 

 

 

 

 

 

 

 

 

 

2010년 12월 25일 토요일

[JAVA] 문자열에 한글 체크하기

 

 

 

 

 

Character라는 클래스에 getType이라는 메소드가 문자값을 받아

character category값을 리턴해줍니다.

 

public static int getType(char ch)

 

사용예 :

 

String str = "한";

char[] temp = str.toCharArray();

int temp = Character.getType(temp[0]);

 

여기서 temp에 값이 5가 저장되면 한글입니다.

 

 

참 ~~ 쉽쬬잉?

 

 

 

 

 

 

 


 

2010년 12월 20일 월요일

[Android] 화면전환 막기, 가로 세로 화면 설정하기

 

 

 

 

 

 

가로, 세로 화면전환시 실행되고 있는 어플이 초기화 onCreate를 불러들여서,

스레드 돌리다가 뻑나는 경우가 생긴다.



매니페스트 파일내에서 화면전환 방향을 변경할 수 있다.
portrait를 선택하면 세로보기만 된다.



 
 


아니면 Activity 내에서 아래 코드로 화면전환시 할일을 정해주면 된다.


public void onConfigurationChanged(Configuration newConfig) {
		// TODO Auto-generated method stub
		super.onConfigurationChanged(newConfig);
		if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
				할일들.....
		}
	}





[출처] - http://stbaeya.com/tc/240?category=45
 

2010년 12월 16일 목요일

[Android] Selector 사용하기

 

 

 

 

버튼에 대한 이벤트마다 이미지를 변경 시켜주기위해

각각의 터치이벤트에 따라 변경 해주는 귀찮은 작업을

좀더 수월하게 처리해주는 것이 있는데 그건 바로 Selector !

 

res -> drawable-hdpi 폴더에 파일을 하나 생성한다

여기서 파일은 xml확장자를 주어야 한다.

 

 

//on_selector.xml 파일

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- Non focused states -->
    <item android:state_focused="false"
        android:state_selected="false"
        android:state_pressed="false"
        android:drawable="@drawable/off" />
 
 <!-- Focused states -->
     <item android:state_focused="false"
        android:state_selected="true"
        android:state_pressed="false"
        android:drawable="@drawable/on" />
    <item android:state_focused="true"
        android:state_selected="false"
        android:state_pressed="false"
        android:drawable="@drawable/on" />
    <item android:state_focused="true"
        android:state_selected="true"
        android:state_pressed="false"
        android:drawable="@drawable/on" />

 

 <!-- Pressed -->
    <item android:state_pressed="true"
     android:drawable="@drawable/on" />
</selector>

 

 

각각 아이템마다 3가지 형태에 따라 이미지를 지정해주고

 

<Button
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:background="@drawable/on_selector"
     />

 

 

나중에 버튼에 대한 백그라운드 이미지에 xml파일을 지정해주면 된다.

셀렉터 너무 좋다 +_+;;ㅋㅋ

 

 

 

 

 



 

 

[Android] failed to install .apk on device Unable to open sync connection! 오류

 

 

 

 

 

이런 에러가 뜨는경우

디바이스적 문제가 있다고 보면 된다

해결법으론 어떤분들은 전면에 꼽힌 USB를 후면에 꽂으니까 없어졌다.

그렇게 말씀하시는데 간단하게 USB를 뺏다 꽂으면 해결 되는거 같다!

 

 

 

 

 

 

2010년 12월 13일 월요일

전국 주소 리스트 2010.11.19 [Update!]

 

 

 

프로그램에 적용할 전국 주소를 텍스트파일에 정리햇다..

나름 노가다.. 구분자 넣어서 http://www.zipfinder.co.kr/ 에서

제공해주는 주소를 하나하나 다 붙여넣기햇다..

나중에 다시 사용하게 될지 몰라서 보관하기로 했다..

혹시 필요하신분들은 사용하셔도 됩니다..

 

 

 

2010년 12월 12일 일요일

[Android] GPS 위도/경도를 이용한 두지점 거리계산 총집합!

 

 

 

 

 

 

GPS를 이용한 두지점간 거리계산 방법입니다.

 

안드로이드에서 기본적으로 제공해주는 직선거리 구하는 방법

지구는 타원으로 되어있기에 가까운지역인 경우 오차가 없지만,

거리가 멀어지면 오차가 발생하는걸 알 수 있습니다.

 

방법1.

 

double distance;
 
Location locationA = new Location("point A");
 
locationA.setLatitude(latA);
locationA.setLongitude(lngA);
 
Location locationB = new Location("point B");
 
locationB.setLatitude(latB);
LocationB.setLongitude(lngB);
 
distance = locationA.distanceTo(locationB);

 

 

 

방법2.

float[] results = new float[3];
Location location = new Location("start");
location.distanceBetween(
startLatitude, 
startLongitude, 
endLatitude,
endLongitude,
results);
Sring mes = Float.toString(results[0]);
 
===============================================================================
The computed distance is stored in results[0]. 
If results has length 2 or greater, the initial bearing is stored in results[1].
If results has length 3 or greater, the final bearing is stored in results[2].
 
 
국토지리원에서 공개한 거리계산 함수 사용하기.
지구는 완전한 구라는 가정하에 지구를 GRS80타원체로 봤을경우
두지점간 거리와 방위각 구하는 소스
 
//거리 구하는 부분
 public double distance(double P1_latitude, double P1_longitude,
   double P2_latitude, double P2_longitude) {
  if ((P1_latitude == P2_latitude) && (P1_longitude == P2_longitude)) {
   return 0;
  }
  double e10 = P1_latitude * Math.PI / 180;
  double e11 = P1_longitude * Math.PI / 180;
  double e12 = P2_latitude * Math.PI / 180;
  double e13 = P2_longitude * Math.PI / 180;
  /* 타원체 GRS80 */
  double c16 = 6356752.314140910;
  double c15 = 6378137.000000000;
  double c17 = 0.0033528107;
  double f15 = c17 + c17 * c17;
  double f16 = f15 / 2;
  double f17 = c17 * c17 / 2;
  double f18 = c17 * c17 / 8;
  double f19 = c17 * c17 / 16;
  double c18 = e13 - e11;
  double c20 = (1 - c17) * Math.tan(e10);
  double c21 = Math.atan(c20);
  double c22 = Math.sin(c21);
  double c23 = Math.cos(c21);
  double c24 = (1 - c17) * Math.tan(e12);
  double c25 = Math.atan(c24);
  double c26 = Math.sin(c25);
  double c27 = Math.cos(c25);
  double c29 = c18;
  double c31 = (c27 * Math.sin(c29) * c27 * Math.sin(c29))
    + (c23 * c26 - c22 * c27 * Math.cos(c29))
    * (c23 * c26 - c22 * c27 * Math.cos(c29));
  double c33 = (c22 * c26) + (c23 * c27 * Math.cos(c29));
  double c35 = Math.sqrt(c31) / c33;
  double c36 = Math.atan(c35);
  double c38 = 0;
  if (c31 == 0) {
   c38 = 0;
  } else {
   c38 = c23 * c27 * Math.sin(c29) / Math.sqrt(c31);
  }
  double c40 = 0;
  if ((Math.cos(Math.asin(c38)) * Math.cos(Math.asin(c38))) == 0) {
   c40 = 0;
  } else {
   c40 = c33 - 2 * c22 * c26
     / (Math.cos(Math.asin(c38)) * Math.cos(Math.asin(c38)));
  }
  double c41 = Math.cos(Math.asin(c38)) * Math.cos(Math.asin(c38))
    * (c15 * c15 - c16 * c16) / (c16 * c16);
  double c43 = 1 + c41 / 16384
    * (4096 + c41 * (-768 + c41 * (320 - 175 * c41)));
  double c45 = c41 / 1024 * (256 + c41 * (-128 + c41 * (74 - 47 * c41)));
  double c47 = c45
    * Math.sqrt(c31)
    * (c40 + c45
      / 4
      * (c33 * (-1 + 2 * c40 * c40) - c45 / 6 * c40
        * (-3 + 4 * c31) * (-3 + 4 * c40 * c40)));
  double c50 = c17
    / 16
    * Math.cos(Math.asin(c38))
    * Math.cos(Math.asin(c38))
    * (4 + c17
      * (4 - 3 * Math.cos(Math.asin(c38))
        * Math.cos(Math.asin(c38))));
  double c52 = c18
    + (1 - c50)
    * c17
    * c38
    * (Math.acos(c33) + c50 * Math.sin(Math.acos(c33))
      * (c40 + c50 * c33 * (-1 + 2 * c40 * c40)));
  double c54 = c16 * c43 * (Math.atan(c35) - c47);
  // return distance in meter
  return c54;
 }
//방위각 구하는 부분
 public short bearingP1toP2(double P1_latitude, double P1_longitude,
   double P2_latitude, double P2_longitude) {
  // 현재 위치 : 위도나 경도는 지구 중심을 기반으로 하는 각도이기 때문에
  //라디안 각도로 변환한다.
  double Cur_Lat_radian = P1_latitude * (3.141592 / 180);
  double Cur_Lon_radian = P1_longitude * (3.141592 / 180);
  // 목표 위치 : 위도나 경도는 지구 중심을 기반으로 하는 각도이기 때문에
  // 라디안 각도로 변환한다.
  double Dest_Lat_radian = P2_latitude * (3.141592 / 180);
  double Dest_Lon_radian = P2_longitude * (3.141592 / 180);
  // radian distance
  double radian_distance = 0;
  radian_distance = Math.acos(Math.sin(Cur_Lat_radian)
    * Math.sin(Dest_Lat_radian) + Math.cos(Cur_Lat_radian)
    * Math.cos(Dest_Lat_radian)
    * Math.cos(Cur_Lon_radian - Dest_Lon_radian));
  // 목적지 이동 방향을 구한다.(현재 좌표에서 다음 좌표로 이동하기 위해서는 
  //방향을 설정해야 한다. 라디안값이다.
  double radian_bearing = Math.acos((Math.sin(Dest_Lat_radian) - Math
    .sin(Cur_Lat_radian)
    * Math.cos(radian_distance))
    / (Math.cos(Cur_Lat_radian) * Math.sin(radian_distance)));
  // acos의 인수로 주어지는 x는 360분법의 각도가 아닌 radian(호도)값이다.
  double true_bearing = 0;
  if (Math.sin(Dest_Lon_radian - Cur_Lon_radian) < 0) {
   true_bearing = radian_bearing * (180 / 3.141592);
   true_bearing = 360 - true_bearing;
  } else {
   true_bearing = radian_bearing * (180 / 3.141592);
  }
  return (short) true_bearing;
 }
 
 
이외 거리 구하는 참고자료는 첨부파일 참고해주세요~
 
 
 
 
 

2010년 12월 10일 금요일

윈도우 XP에서 외장HDD, 메모리가 제거 되지 않을경우

 

 

 

 

 

 

 

 

 

작업관리자에서 explorer.exe를 강제 종료 시킨 후에 재실행하면 제거 가능하다.

<작업관리자에서 explorer.exe를 종료시킨 후>

<파일 -> 새 작업 클릭>

<explorer.exe를 재실행>

그 후에 USB 하드디스크 혹은 메모리를 제거하면 된다.









2010년 12월 8일 수요일

[Android] 폰트(글씨체)변경 하기 (FontType Change)

 

 

 

 

 

 

안드로이드를 개발하다보면 제공해주는 글씨체가 3개밖에 없습니다.

그래서 보다 더 깔끔하고 이쁘게 꾸미기 위해

폰트를 변경하는 방법을 적어보도록 하겠습니다.

C:\WINDOWS\Fonts폴더에 보시면 윈도우에 제공해주는 폰트들이 있습니다.

그중에 아래 그림의 아이콘이 안드로이드에서 사용가능한 폰트파일 입니다.

 

 

 

 

 

 

원하시는 폰트를 복사해서

안드로이드 프로젝트에 assets/fonts 폴더 아래 넣어주게 합니다.

그리고

 

자바파일:
TextView tv=(TextView)findViewById(R.id.custom);
Typeface face=Typeface.createFromAsset(getAssets(), "fonts/폰트이름.ttf");

main.xml 파일:

<TextView
            android:id="@+id/custom"
            android:text="Hello, world!"
            android:textSize="20sp" />

 

 

이런식으로 폰트를 변경 할 수 있습니다.

현재는 TextView 단일 위젯만 변경이 가능하지만, 혹시 클래스나

레이아웃 전체를 변경 하실 수 있는 방법을 아시는 분은 좀 알려주세요 ㅠ.ㅠ

 

 

 

 

ps. 안드로이드로 사용가능한 폰트 몇개 올려둡니다.

 

 

 

 

 

 

 

 

 

 

 

 

[Android] 음성 인식 API 소스

 

 

 

 

구글링중에 음성인식 API를 사용해서 음성인식 하는 방법을 찾았다.

나름 인식률 80프로 이상 인거 같다..

인식률이 잘나오는 만큼 다방면에 사용될거 같은..

음성 입력후 패턴분석된 결과 리스트가 나열되는 소스이다.

 

 

voiceDemo.java 파일

 

 

public class voiceDemo extends Activity implements OnClickListener {
 private static final int REQUEST_CODE = 1234;
 private ListView mList;
 private ListView mDebug;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Button speakButton = (Button) findViewById(R.id.btn_speak);
  speakButton.setText("음성입력");
  mList = (ListView) findViewById(R.id.list);
  PackageManager pm = getPackageManager();
  List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(
    RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
  if (activities.size() != 0) {
   speakButton.setOnClickListener(this);
  } else {
   speakButton.setEnabled(false);
   speakButton.setText("Recognizer not Present");
  }
 }

 public void onClick(View v) {
  if (v.getId() == R.id.btn_speak) {
   startVoiceRecognitionActivity();
  }
 }

 private void startVoiceRecognitionActivity() {
  try {
   Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
   intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
     RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
   intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
     "Free Form Language Model Demo");
   startActivityForResult(intent, REQUEST_CODE);
  } catch (ActivityNotFoundException ex) {
   Toast
     .makeText(voiceDemo.this, "Activity Not Found",
       Toast.LENGTH_LONG).show();
  }
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
   ArrayList<String> matches = data
     .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
   mList.setAdapter(new ArrayAdapter<String>(this,
     android.R.layout.simple_list_item_1, matches));
  }
  super.onActivityResult(requestCode, resultCode, data);
 }
}

 

 

 

 

 

 

main.xml 파일

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
 <TextView
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:paddingBottom="4dip" />
 <Button
 android:id="@+id/btn_speak"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/speak_button" />
 <ListView
 android:id="@+id/list"
 android:layout_width="fill_parent"
 android:layout_height="0dip" android:layout_weight="1" />
</LinearLayout>

 

 

 

2010년 12월 7일 화요일

[Android] 2.3 Platform SDK Update!!!

 

 

 

오늘 새벽에 2.3 생강빵 올라왓네요

 

http://developer.android.com/sdk/android-2.3.html

 

조금전에 확인하고 바로 SDK 업데이트 시켯지만..

 

잘못 햇는지 이런 오류뜨네요//

 

뭐 sdk폴더 위치 지정이 잘못된거 같은데.. 흠...

 

시간도 그렇고 자고 내일 일어나서 해야겟음..

 

여러분도 조심해서 업데이트 하시길..

 

 

 

 

 

 

 

 

 

Could not find
C:\..\tools\adb.exe!
Please check the Android plugin's preferences.

 

 

// 에러 원인을 찾았다..

문제는 이클립스 플러그인 (ADT)를 업데이트 하지 않았기 때문..

 

 

 

Eclipse 3.5 (Galileo) and 3.6 (Helios)
  1. Start Eclipse, then select Help > Install New Software....
  2. Click Add, in the top-right corner.
  3. In the Add Repository dialog that appears, enter "ADT Plugin" for the Name and the following URL for the Location:
    https://dl-ssl.google.com/android/eclipse/

    Note: If you have trouble acquiring the plugin, try using "http" in the Location URL, instead of "https" (https is preferred for security reasons).

    Click OK.

  4. In the Available Software dialog, select the checkbox next to Developer Tools and click Next.
  5. In the next window, you'll see a list of the tools to be downloaded. Click Next.
  6. Read and accept the license agreements, then click Finish.
  7. When the installation completes, restart Eclipse.

 

 

 

 

[Android] 어플리케이션 Process 를 얼추 죽이는 새로운 방법

 

 

 

프로세스를 정상종료 하려고 구글링 하다가 발견한 방법..

기존의 프로세스 죽이는 방법은 2.1까지만 지원되다가

2.2 부터는 아직까지 정확하게 프로세스를 정상종료 시키는 방법이 없다고 합니다.

하지만 거의(얼추) 죽이는 방법이 있다고 해서 포스팅 해봅니다.

 

 

 

 

public void requestKillProcess(final Context context){
	
	//#1. first check api level.
	int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
	if (sdkVersion < 8){
		//#2. if we can use restartPackage method, just use it.
		ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		am.restartPackage(getPackageName());
	}else{
		//#3. else, we should use killBackgroundProcesses method.
		new Thread(new Runnable() {
			@Override
			public void run() {
				ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
				String name = getApplicationInfo().processName;
				RunningServiceInfo si;
				
				//pooling the current application process importance information.
				while(true){
					List<RunningAppProcessInfo> list = am.getRunningAppProcesses();
					for(RunningAppProcessInfo i : list){
						if(i.processName.equals(name) == true){
							//#4. kill the process,
							//only if current application importance is less than IMPORTANCE_BACKGROUND
							if(i.importance >= RunningAppProcessInfo.IMPORTANCE_BACKGROUND)
								am.restartPackage(getPackageName());	//simple wrapper of killBackgrounProcess
							else
								Thread.yield();
							break;
						}
					}
				}
			}
		}, "Process Killer").start();
	}
}

 

안드로이드 프로요 2.2 아래 버젼 일경우 ..

1.메니페스트 파일에 RESTART_PACKAGES 권한을 사용한다고 선언한다.
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>

2.ActivityManager 의 restartPackage API 를 호출한다.
ActivityManager am
             = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
am.restartPackage(getPackageName());

이것도 말끔히 종료 되진 않지만 그래도 얼추 죽일 수 있다고 하네요..

 

 

 

 

안드로이드 프로요 2.2 윗 버젼 일경우 ..

 

SDK 버전과 관계없이 프로세스를 종료할 때 사용할 수 있는 requestKillProcess() 라는 메서드를 구현하였습니다. 프로요 이전 버전인 경우, 기존에 사용하던 방법이 그대로 별다른 생각없이 restartPackage() 메서드를 호출 하도록 구현되어 있습니다.


 프로요 이 후 버전인 경우가 조금 골치 아픈데, 어느 시점에 해당 어플리케이션 프로세스의 우선 순위가 변경될지 알아내는 방법을 잘 몰라서, 주기적으로 프로세스 상태 정보를 폴링하도록 구현되었습니다. 스레드를 하나 생성한 후, 프로세스의 상태를 반복 체크하다가, 프로세스 중요도가 IMPORTANCE_BACKGROUND 보다 낮아지는 순간, restartPackage() 를 호출 하도록 되어있습니다.

 어째, 구현 내용이 좀 꺼림직 하긴 합니다만, 어플리케이션 내에서 사용하는 어플리케이션 컴포넌트 (Service / Activity / BroadcastReceiver ) 관리에만 신경을 써 준다면 (시작한 Service 는 잊지 않고 정지 시켜주는 등), 기존 restartPackage() 와 같이 어플리케이션 어느 시점에 호출에도 얼추 비슷하게 동작하는 것은 확인 하였습니다. (스레드가 계속 도니까;;;;)

 

 

 

[출처] - http://huewu.blog.me/110089551997

2010년 12월 6일 월요일

[Android] 자신의 전화번호 가져오기

 

 

 

TelephonyManager telManager = (TelephonyManager)context.getSystemService(context.TELEPHONY_SERVICE);
String phoneNum = telManager.getLine1Number();

 

이렇게 하면 가져올 수 있습니다..

 

그리고

manifest 파일에 uses-permission 을 설정 해야 되겠습니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE" />





2010년 11월 27일 토요일

[WEB] form 의 GET & POST 방식의 차이

 

 

 

 

 

 

 

 

웹 문서에서 아이디나 비밀번호 또는 다른 데이터 들을 서버측 으로 보낸 다음 수행이 되는 경우가 있다. 이때 문서에서 서버측 으로 데이터가 전달되는 방법이 2가지가 있는데 GET 방식과 POST방식이다. 각각의 방식들은 나름대로의 장단점을 가지고 데이터를 전달하는 역할을 한다.




GET 방식

1.웹 브라우저의 주소 입력란에서 아래와 같이 직접 입력하여도 데이터를 서버로 전송한다.(클라이언트로 부터의 데이터를 이름과 값이 겨합된 스트링 형태로 전달 하므로 각각 이름과 값은 “&”를 이용하여 결합한다.

ex) (http://localhost/chs/book/Request.jsp?Name=Michael&Depy=Computer)

2.기본적으로 데이터베이스에 대한 질의어 데이터와 같은 요청을 위한 정보를 전송할 때 사용

3.GET방식으로 보낼때는 같이 딸려가는 글자수에 제한이 있다(255자).

4.GET 방식을 사용하면 이를 초과하는 데이터가 절단된다.

5.GET 방식을 사용하면 데이터가 주소 입력란에 표시되므로 최소한의 보안도 유지되지 않는다.

6.GET 방식은 정보를 URL의 끝에 질의 문자열로서 서버로 보내어진다.

7.데이터를 쿼리 스트링(Query String)의 일부로써 전달한다.

8. 일반적인 HTTP 호출은 모두 GET 방식으로 이루어진다.

9.변수 넘기지 않는 일반 호출도 GET 이다.

10. 사용이 간편하다는 장점이 있다.

11.사용 예)

get 방식 예제

<HTML>

<HEAD><TITLE> get 방식 예제 </TITLE></HEAD>

<BODY><CENTER>

<FORM NAME="form1" ACTION="get_meth_view.asp" METHOD="get">

    이 름 : <INPUT TYPE="text" NAME="uname">

    메 일 : <INPUT TYPE="text" NAME="mail">

    <P></P>

    <INPUT TYPE="submit" VALUE="전송">

    <INPUT TYPE="reset" VALUE="다시">

</FORM></CENTER>

</BODY>

</HTML>

테스트 후 브라우저의 주소박스에 보여지는 URL은 다음과 같다.

http://localhost/object_asp/get_meth_view.asp?uname=seong+gigoo&mail=midibest@orgio.net




POST 방식

1.POST 방식은 HTTP 헤더에 숨겨져(인코드되어) 서버로 전송이 됩니다.

2.다음과 같이 브라우저의 주소창에는 실행 파일명만 나타납니다.

http://localhost/object_asp/post_meth_view.asp

3.일반적으로 HTML의 FORM을 이용해서 넘기는 방식입니다.

4.이 방식은 서버에 값을 넘기기 위해 만들어진 방식입니다.

5. 데이터베이스에 대한 갱신 작업과 같은 서버측에서의 정보 갱신 작업을 원할 때 사용

6.POST 방식을 사용하면 GET 방식에 비해 상대적으로 처리 속도가 늦어짐

7.클라이언트로부터의 데이터가 HTTP 헤더에 포함되어 전송

8.일정한 크기 이상의 데이터를 전송할 때에는 POST 방식을 사용

9.내부의 구분자가 각 파라미터(이름과 값)를 구분

10.클라이언트측에서 데이터를 인코딩 → 서버측에서 디코딩 클라이언트와 서버간에 상호 정의되어 있는 형식대로 값을 인코딩한 다음 서버로 전송

서버 : 전달된 스트링을 디코딩 → 각 파라미터를 구분 → 필요한 값들을 추출

11.사용 예)

파일명 : post_meth_vtest.htm

<HTML>

<HEAD>

<TITLE> POST 방식 예제 </TITLE>

</HEAD>

<BODY>

<CENTER>

<FORM NAME="form1" ACTION="post_meth_view.asp" METHOD="post">

    이 름 : <INPUT TYPE="text" NAME="uname">

   <BR>

    메 일 : <INPUT TYPE="text" NAME="mail">

  <BR><BR>

    <INPUT TYPE="submit" VALUE="전송">

    <INPUT TYPE="reset" VALUE="다시">

</FORM>

</CENTER>

</BODY>

</HTML>

출처 : Tong - bitworld님의 ♣ php/mysql통


==========================

<input type='hidden' name='mode' value='mode'>

 

 

 

 

 

[출처] - http://www.ezslookingaround.com/blog/tech/?no=1380

 

 

 

 

 

 

 

2010년 11월 23일 화요일

웹에서 로딩 gif 만들기

 

 

 

 

 

http://www.webscriptlab.com/

 

 

들어가 보셔요~

[Android] 한 줄에서 몇 줄로 되는 필요한 잡코드들

 

 

 

17. Android 키보드 숫자형으로 시작하게 하기
edittext.setInputType(InputType.TYPE_CLASS_NUMBER);

16. Android listview 검정화면 없애기
android:cacheColorHint="#00000000"

15. Android 화면 고정하기
AndroidManifest.xml의 activity 속성중 screenOrientation을 다음과 같이 지정해준다.

//화면을 세로로 유지
<activity android:name=".Powermeter"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">
//화면을 가로로 유지
<activity android:name=".Powermeter"
                  android:label="@string/app_name"
                  android:screenOrientation="landscape">
자바 소스에서
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

14. Android Handler example
  // 시간주고 바로 뜨게 하기 20이 최소 가능 값..
        new Handler().postDelayed(new Runnable() {
            public void run() {
                openOptionsMenu();
            }
        }, 20);

13. Android 소프트 키보드 끄기 및 보이기 및 숨기기
  // 키보드 오프시키는 소스..
  EditText et = (EditText)findViewById(R.id.menu6_e_number);
  et.setInputType(0); //가상키보드 오프

1. 보이게 하기

EditText et = (EditText)findViewById(R.id.moneyEdit);
et.setInputType(0); //가상키보드 오프
       
        et.setOnClickListener(new OnClickListener() {  
   public void onClick(View arg0) {    
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
          imm.showSoftInput(input, 0);
   }         
        });

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, 0);

2. 숨기기
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);


12. Android  Edittext Hint, 흐리게 보이기
android:hint="ex) 안드로이드"


11. Android  EditText 숫자키만 허용하기

DigitsKeyListener digit =
new DigitsKeyListener(true, true); // first true : is signed, second one : is decimal
digit.setKeyListener( MyDigitKeyListener );

위와같이 하거나 xml 에서

android:inputType="number"


10. Android  Option menu 실행 소스
openOptionsMenu();


9. Android Menu 만들기
- xml 소스
res/menu/menu.menu

<menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:id="@+id/adjust"
  android:title="수정"
  android:orderInCategory="1" >
 </item>
 <item
  android:id="@+id/delete"
  android:title="삭제"
  android:orderInCategory="2" >
 </item>
</menu>

- 자바 소스
 // OptionMenu
 public boolean onCreateOptionsMenu(Menu menu){
  getMenuInflater().inflate(R.menu.del_adjust, menu);
  return true;
 }

    // OptionMenu click event
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
   case R.id.adjust:
    finish();
    return true;
   
   case R.id.delete:
    finish();
    return true;
  }
  return false;
 }

8. Android Dialog 만들기 (Android.Dialog.Builder())

기존에는 Activity에서 showAlert(()를 제공해줬나보다. (예제를 보니...)
더 이상 지원하지 않기 때문에 AlertDialog.Builder()를 이용하여 Dialog를 생성하였다.

*onClickLister() 생성시 반드시 DialogInterface.OnClickListener()라고 클래스를 적어줘야 한다.
 (Activity에서 button 클릭 이벤트를 처리하기 위해 import한 View 클래스에 OnClickListener 메소드가 있다.)

a. Android  yes or no - 버튼 2개짜리
new AlertDialog.Builder(LoginMainActivity.this)
.setTitle("Login Data")
.setMessage("rosa : test") //줄였음
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {                                        
        //...할일
    }
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        //...할일
    }
})
.show();

b. Android  ok (or cancel)
new AlertDialog.Builder(LoginMainActivity.this)
        .setTitle("Login Data")
        .setMessage("rosa : test") //줄였음
        .setNeutralButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {                                        
                //...할일
            }
        })        
        .show();

c. Android   다른 layout 출력
new AlertDialog.Builder(LoginMainActivity.this)
.setTitle("list 예제")        
.setItems(R.array.listBtnArray, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int selectedIndex) {        
        String[] list = getResources().getStringArray(R.array.listBtnArray);        
        new AlertDialog.Builder(LoginMainActivity.this)
        .setTitle("선택한 리스트 아이템")
        .setMessage(list[selectedIndex])
        .setNeutralButton("OK", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub                        
            }                    
        });                
    }
    })
.show();

--
value 값으로 array 추가
<string-array name="listBtnArray">
        <item>One</item>
        <item>Two</item>
        <item>Three</item>
    </string-array>



7. Android  뒤로 가기 키
 onBackPressed();

6. Android  바이브레이터
Vibrator vibe = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibe.vibrate(500);
// 퍼미션        
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>

5. Android  밝기 셋팅
Window w = getWindow();
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = 0~1까지의 float 값;
w.setAttributes(lp);

-1.f를 주면 default 밝기로 세팅됩니다.

4. Android  화면 꺼지는것 막기
현재 Activity가 보여지고 있는 동안은 시간이 지나도
화면이 자동으로 꺼지지 않도록 합니다.
즉 단말이 슬립상태로 들어가지 않고 계속 화면을 켜놓습니다.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

3. Android  toast
1-Type
Toast.makeText.(this, "토스트 메세지", Toast.LENGTH_SHORT).show();

2-Type
Context context = getApplicationContext();
String msg = "";
int duration = Toast.LENGTH_SHORT;
Toast.makeText(context, b, duration).show();


2. Android  View 백그라운드 색 변경
TextView a = null;
a.setBackgroundColor(Color.WHITE);

1. Android  timer 이용
http://docs.androidside.com/docs/reference/java/util/TimerTask.html
--------------------------------------------------------------------------------------------------
모토로이 볼륨 올리고 내리는 버튼 키값을 알아내서
edittext 에 원하는 값을 넣는 방법 볼룸 위아래 버튼을 누르면
화면에 벨로시 볼륨 조절하는 창이 나타나는데 완전히 키값을 가로채는 방법

et_editText.setOnKeyListener(new OnKeyListener() {
       
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
           // TODO Auto-generated method stub
           if(event.getAction() == KeyEvent.ACTION_DOWN){
              if(keyCode == 24 || keyCode == 25){
              et_editText.setText("1234567890");
             
              return true;
              }
           }
           return false;
        }
       
     });


- 전체적으로 필요한 기능
// 종료 후 재 부팅시 기능이 죽지않고 유지되게 하는 방법들..
http://www.androidpub.com/android_dev_qna/189549

- 박사마 만드는데 필요한 기능
// view에서  페이지 넘기는 기능
API Demos에서 Animation에 간단하게 Fade in, Zoom in 효과가 있네요.

내가 만드는 부분에 필요한 부분들
// 강제로 클릭을 발생시키는 이벤트
dispatchTouchEvent
// 좌표관련들..
getWidth()랑 getHeight()로 전체 좌표값을 얻어오고 %로 비율 정해서 좌표값 설정하세요






[출처] - http://winchester.tistory.com/tag/%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%EC%83%89%20%EB%B3%80%EA%B2%BD



2010년 11월 20일 토요일

[JAVA] int, float, double ↔ String 형변환 / 진수 변환

 

 

 

 

숫자를 문자열로 바꾸기
int i = 1234;
String s = String.valueOf(i);     문자열 "1234"로 변환
String s = Integer.toString(i);   문자열 "1234"로 변환
String s = ””+i;                문자열 "1234"로 변환
String s = “”+12.34;            문자열 "12.34"로 변환
String s = “”+0;                문자열 "0"로 변환

 

문자열을 숫자로 바꾸기
String str = "1234";
int i = Integer.valueOf(str).intValue();
int i = Integer.parseInt(str);
long i = Long.parseLong(str)
double i = Double.valueOf(str).doubleValue();
Byte.parseByte(str)        바이트형 정수로 변환
Short.parseShort(str)      short형 정수로 변환
Integer.parseInteger(str)  int형 정수로 변환
Long.parseLong(str)        long형 정수로 변환
Float.parseFloat(str)      float형 부동 소수로 변환
Double.parseDouble(str)    double형 부동 소수로

 

 

문자 16진수 → 숫자 10진수

String strHexValue = "A";
System.out.println(Integer.parseInt(strHexValue, 16));

>> 10

 

숫자 10진수 → 문자 16진수

System.out.println(Integer.toString(intHexValue, 16));

>> a

 

소문자 → 대문자

String strSmallA = "a";
String strLargeA = strSmallA.toUpperCase();

 

문자 비교

"a".equals("A") → false
"a".equalsIgnoreCase("A") → ture

 

 

 

 

 

 

 

 

2010년 11월 19일 금요일

Android의 TableLayout 의 코너를 둥글게

 

 

 

 

 

iPhone 의 UI 를 보면 다음의 이미지와 같이 테이블의 네귀퉁이 각 모서리가

둥글게 둥글게 처리되어 있는것을 볼수 있다.




이와같은 둥근 모서리를 안드로이드에서 구현을 해보려고 한다.
처음엔 9Patch image 를 쓰려했지만 검색결과 Drawable XML 을 가지고 편하게
둥근 모서리를 구현시킬수 있었다.
나는 TableLayout 에 적용해보았지만 백그라운드에 적용시키는것이기 때문에
다른곳에도 적용할수 있을 것이다.

먼저 Reaource (res) 안의 drawable 폴더에 다음과 같은 XML 을 생성한다.
나는  com_rounded_corner.xml  이라고 저장 하였다.

<?xml version="1.0" encoding="UTF-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#99FFFFFF"/>

    <corners android:radius="15dip"/>

    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" /> 

</shape>


그리고 layout 의 적용할 부분의 background 에 해당 XML 을 넣어준다.

<TableLayout android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="@drawable/com_rounded_corner"

android:padding="10dip"

android:orientation="vertical">


...


</TableLayout>


그러면 다음과 같이 둥글게 깍인 백그라운드를 쉽게 가질수 있다 :-)

2010년 11월 9일 화요일

[Android] 웹페이지 소스 텍스트파일로 저장하기

 

//넘겨주는 url인데 한글을 넘겨줄때 인코딩을 해서 넘겨줘야 한다는것!

String url_str = "http://map.naver.com/local/search.nhn?query=";
String searchName = URLEncoder.encode("부산 남구  감만2동 경명중국관");
   
    try {
     InputStream inputStream = new URL(url_str+searchName).openStream();
     InputStreamReader isr = new InputStreamReader(inputStream, "UTF-8");
     BufferedReader br = new BufferedReader(isr);
     
     File file = new File("/mnt/sdcard/url.txt");
     OutputStream out = new FileOutputStream(file);
     writeFile(br, out);
     out.close();
    }
    catch (Exception e) {
     
    }
    finally {
     Toast.makeText(parsingtest.this, "저장완료", Toast.LENGTH_SHORT).show();
    }

 

 

 

//AndroidManifest.xml에 권한 추가하기

<!-- 외부메모리에 저장할때 작성 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

2010년 11월 5일 금요일

[JAVA] 스트링(String) 클래스의 length, substring, compareTo 와 StringTokenizer() 클래스

 

 

자바기반인 안드로이드의 문자열을 다룰때 사용할 스트링 클래스들 입니다.

 

스트링 클래스에는 문자열을 분석하거나 조작하기 위한 몇가지 기본 메서드를 지원한다.

<length() 메서드>

String a = "ABC";
int len = a.length();

이것은, 문자열의 길이를 구해준다.

재미있는 점은, 한글이나 영문,숫자등을 모두 한글자를 1 로 계산한다는 것이다.

    String a = "ab";
    String b = "가나";
    System.out.println(a.length());
    System.out.println(b.length());

위와같이 영어 두글자와 한글 두글자의 길이를 출력시키면, 모두 2 라는 똑같은 값이 나온다.
즉, 바이트 기준이 아니라, 문자 기준이라는 것이다.

일부, 프로그램에서 한글의 경우 2배수가 나오는 것에 비하면 꽤나 편리한 편이다.


<substring() 메서드>
substring() 메서드는 자바스크립트나 php 에서와 동일하게 문자열의 일부를 가져오는 것이다.

String a = "ABCDEF";
String b = a.substring(2, 5);  //2번 이후부터 5번 전까지 가져옴 (CDE 를 가져옴)

역시, 주의할점은, 처음 시작이 0 번 부터라는 것이다.
즉, A=0, B=1, C=2, D=3, E=4, F=5
가 되고, 2번부터라면, C 부터 시작함을 의미하고, 5번 전까지이기 때문에 E 까지 가져온다.

    String a = "abcdef";
    String b = "가나";
   
    String c = new String();
    c = a.substring(2,5);
    System.out.println(c);  // 'cde' 출력
   
    String d = new String();
    d = b.substring(1,2);  //'나' 출력
    System.out.println(d);

위의 출력 예를 보면 이해가 쉽다.

자바나, php 등을 오래 한사람은 substring 가 익숙하겠지만,
ASP 의 Mid 나 substr 같은 용법에 익숙한 사람은 아무래도 헷갈리는데,
아쉽게도 자바에는 기본적으로 substr 메서드가 없다.


<compareTo() 메서드>

메서드 이름에서 알 수 있듯이, 이는 두 문자열을 비교하는 메서드이다.

public class a
{
  public static void main(String [] args){
    String a = "ABC";
    String b = "ABC";
    String c = "BCD";
    String x = "B";
   
    int d = a.compareTo(b);
    int e = a.compareTo(c);
   
    System.out.println(d);  //0 출력
    System.out.println(e);  //-1 출력
   
    int y = a.compareTo(x);
    System.out.println(y);  //-1 출력
   
    int w = x.compareTo(a);
    System.out.println(w);  //1 출력
  }
}

즉, a 와 b 를 비교했을때, 완전히 일치하기 때문에 0 을 반환하였고,
a 와 c 를 비교했을때, 부분적으로는 비슷한 문자가 들어있지만, 문자열 전체를 봤을때는 일치하지 않으므로, -1 을 반환한다.
(-1 은 전혀 다르다는 것을 의미)

그런데, 특이한 점은(주의) 어느것을 기준으로 비교하느냐에 따라 값이 차이가 난다는 것이다.
a.compareTo(b)
라는 문법은, b 에다가 a 문자열을 대조해보는 것으로, 기준이 되는 것이 괄호안에 들어 있는 b 문자열이다.
따라서,
x="B" 에다가 a="ABC" 를 비교하면, 어느곳에도 일치하지 못하기 때문에 -1 이 반환되지만,
a="ABC" 에다가 x="B" 를 비교하면, 문자 B 가 두번째에 위치하고 있기 때문에(0부터 시작해서 1위치),
결과값이 1 이 반환되는 것이다.

테스트를 통해서도 보았지만, 어느것을 기준으로 비교하는지 헷갈리지 않도록 주의해야 하며,
대체로는 지정한 문자열이 대상 문자열에 들어 있는지 또는 두 문자열이 똑같은지 정도로만 체크하는 용도로 주로 사용된다.


<StringTokenizer() 클래스>

StringTokenizer 클래스는 문자열을 분할하는 클래스이다.(분할한 문자열을 토큰이라고 부른다)
이것은 자바스크립트, PHP 의 split 와 비슷한 기능을 하는 클래스이다.

사용 방법은 아래와 같다.

StringTokenizer a = new StringTokenizer("i,love,cat", ",");

이것은 'i,love,cat' 라는 문자열을 콤마(,) 를 기준으로 분할한다는 의미이다.
이렇게 분할해서, 만약 분할이 되면(토큰이 있으면) true 를 반환한다.
그러면, nextToken() 메서드를 이용해 하나씩 불러올 수 있다.

사용예시)
<a.java 의 내용>------------------------------

import java.util.*;

public class a
{
  public static void main(String [] args){
    StringTokenizer msg = new StringTokenizer("i,love,you", ",");
    //만약, 토큰의 분할 방법을 기술하지 않으면 공백을 기본으로 하여 구분한다.
    // StringTokenizer("i love you"); 와 같이 사용 가능.
   
    String a="",b="",c="";
   
    //System.out.println(msg);
    /* 아래와 같이 직접 지정할 수 있다.
      a = msg.nextToken();
      b = msg.nextToken();
      c = msg.nextToken();
     
      String x = a + b + c;  //iloveyou 출력
      System.out.println(x);
    */
   
    String x = new String();
   
    //x = msg.nextToken();  //이 부분은 써도되고, 안써도 상관없다.
    while(msg.hasMoreTokens()){  //토큰이 없을때까지 반복한다.
      x = x + msg.nextToken();
    }
    System.out.println(x);  //iloveyou 출력
  }
}
--------------------------------------------

주의할점은, StringTokenizer 클래스를 사용하기 위해서는 java.util 을 임포트 해야 한다는 것이다.


 

2010년 10월 29일 금요일

안드로이드 위젯 가이드



안드로이드 위젯 가이드입니다.
아래 소스 코드 가져다가 개발하시면 편할 것 같네요.


AnalogClock


<AnalogClock
id="@+id/clock1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
Button
<Button id ="@+id/button1"
android:text="Label"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<Button id ="@+id/button2"
android:text="Label"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:typeface="serif"
/>
<Button id ="@+id/button3"
android:text="Label"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textStyle="bold_italic"
/>
CheckBox
<CheckBox id="@+id/plain_cb"
android:text="Plain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<CheckBox id="@+id/serif_cb"
android:text="Serif"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:typeface="serif"
/>
<CheckBox id="@+id/bold_cb"
android:text="Bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
/>
<CheckBox id ="@+id/italic_cb"
android:text="Italic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="italic"
/>
DatePicker
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

...
// Required Java init code:
DatePicker dp =
(DatePicker)this.findViewById(R.id.widget27);

// for example init to 1/27/2008, no callback
dp.init(2008, 0, 27, Calendar.SUNDAY, null);
...
DigitalClock
<DigitalClock id="@+id/digitalclock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
EditText
<EditText id ="@+id/edittext1"
android:text="EditText 1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<EditText id ="@+id/button2"
android:text="(206)555-1212"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:typeface="serif"
android:phoneNumber="true"
/>
<EditText id ="@+id/password"
android:text="SuperSecret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold_italic"
android:password="true"
/>
Gallery
<Gallery
id="@+id/gallery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
ImageButton
<ImageButton id="@+id/imagebutton"
android:src="@drawable/brush"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
ImageView
<ImageView id="@+id/imagebutton"
android:src="@drawable/brush"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
ProgressBar
<ProgressBar id="@+id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
RadioButton
<RadioGroup
id="@+id/widget1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
>
<RadioButton
id="@+id/widget2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Plain"
android:checked="false"
android:layout_gravity="left"
android:layout_weight="0"
>
</RadioButton>
<RadioButton
id="@+id/widget3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Serif"
android:checked="true"
android:layout_gravity="left"
android:layout_weight="0"
android:typeface="serif"
>
</RadioButton>
<RadioButton
id="@+id/widget25"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bold"
android:checked="false"
android:layout_weight="0"
android:layout_gravity="left"
android:textStyle="bold"
>
</RadioButton>
<RadioButton
id="@+id/widget24"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bold & Italic"
android:checked="false"
android:layout_weight="0"
android:layout_gravity="left"
android:textStyle="bold_italic"
>
</RadioButton>
</RadioGroup>
Spinner
<Spinner
id="@+id/widget1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectoronTop="false"/>
TextView
<TextView id="@+id/plain"
android:text="Plain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView id="@+id/serif"
android:text="Serif"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:typeface="serif"
/>
<TextView id="@+id/bold"
android:text="Bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
/>
<TextView id ="@+id/italic"
android:text="Italic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="italic"
/>
TimePicker
<TimePicker
id="@+id/widget3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>




[출처] - http://www.droiddraw.org/widgetguide.html









구글맵 API - GPS로 현재위치 받아와서 표시하기

 

 

 

 

현재 위치 표시

 

지도 위에 겹쳐서 표시되는 정보 중 가장 실용적인 것은 사용자의 현재 위치이다. 사용자는 자신의 위치로부터 정보를 얻으므로 현재 위치가 어디인가는 항상 표시해야 할 중요한 정보이다. 현재 위치를 표시하는 방법은 아주 원론적인데 위치 제공자로부터 위치를 조사하고 해당 좌표에 표식을 추가하면 된다. 그러나 앞에서 연구해 봤다시피 다량의 코드가 필요하다.

다행히 이 번거로운 작업을 대신 해 주는 오버레이가 제공된다. MyLocationOverlay 클래스는 이름이 의미하는 바대로 현재 위치를 조사하여 오버레이로 표시까지 해 준다. 이 객체를 생성하여 맵뷰의 오버레이로 추가해 놓기만 하면 내부적으로 위치 정보를 수신하여 현재 위치를 보여주며 더불어 나침반이 있는 장비인 경우 방향 정보까지도 같이 표시한다.

개발자가 해야할 잡스러운 처리를 모두 대신 해 주므로 굉장히 편리한 클래스이다. 그러나 이 기능들이 동작하려면 백그라운드에서 여분의 코드를 계속 실행해야 하므로 배터리 성능에는 부정적이다. 그래서 기능을 켜고 끌 수 있는 메서드들을 제공한다. 액티비티가 실행중일 때만 이 기능들이 필요하므로 onResume에서 켜고 onPause에서 정지시키는 것이 합리적이다.

 

boolean enableMyLocation()

void disableMyLocation()

boolean enableCompass()

void disableCompass()

 

 다음 메서드는 처음 위치가 조사될 때 실행될 러너블을 등록한다. 이 러너블은 분리된 스레드에서 실행되며 첫 조사된 위치로 이동하는 등의 처리를 할 수 있다.

 

boolean runOnFirstFix(Runnable runnable)

 

현재 위치는 파란색의 반짝거리는 원으로 표시되는데 이 표식을 탭하면 다음 메서드가 호출된다. 이 메서드를 재정의하면 현재 위치를 탭 했을 때의 처리를 수행할 수 있된 단, 메서드를 재정의하려면 상속을 받아야 한다는 점에서 약간 번거롭기는 하다.

 

boolean dispatchTap()

 

모든 것이 자동화되어 있으므로 이 클래스를 사용하는 것은 굉장히 쉽다. 객체 만들어 오버레이에 추가하고 적당한 때에 기능을 켜 주기만 하면 나머지는 내부에서 알아서 처리한다.

 

location/MyLocationOverlay

public class OverlayLocation extends MapActivity {

     MapView mMap;

     MyLocationOverlay2 mLocation;

 

     protected boolean isRouteDisplayed() {

          return false;

     }

 

     public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.location_mapviewtest);

 

          mMap = (MapView)findViewById(R.id.mapview);

          MapController mapControl = mMap.getController();

          mapControl.setZoom(13);

          mMap.setBuiltInZoomControls(true);

 

          GeoPoint pt = new GeoPoint(37881311, 127729968);

          mapControl.setCenter(pt);

 

          mLocation = new MyLocationOverlay2(this, mMap);

          List<Overlay> overlays = mMap.getOverlays();

          overlays.add(mLocation);

 

          mLocation.runOnFirstFix(new Runnable() {

              public void run() {

                   mMap.getController().animateTo(mLocation.getMyLocation());

              }

          });

     }

 

     public void onResume() {

          super.onResume();

          mLocation.enableMyLocation();

          mLocation.enableCompass();

     }  

 

     public void onPause() {

          super.onPause();

          mLocation.disableMyLocation();

          mLocation.disableCompass();

     }

 

     class MyLocationOverlay2 extends MyLocationOverlay {

          public MyLocationOverlay2(Context context, MapView mapView) {

              super(context, mapView);

          }

         

          protected boolean dispatchTap() {

              Toast.makeText(OverlayLocation.this, "여기가 현재 위치입니다.",

                        Toast.LENGTH_SHORT).show();

              return false;

          }

     }

}

 

춘천 시청을 지도 중앙에 표시했으며 현재 위치 오버레이를 생성하여 살짝 얹어 놓았다. onResume에서 현재 위치와 나침반 기능을 활성화시키고 onPause에서는 두 기능을 정지시킨다. 현재 위치가 처음 확인될 때 해당 좌표로 이동하는 러너블을 등록해 놓았으므로 위치 정보가 수신되는 즉시 현재 위치가 화면 중앙에 올 것이다.

현재 위치는 위치 제공자로부터 수신되는데 알다시피 에뮬레이터에서는 불가능하다. 그래서 DDMS로 가짜 좌표를 던져 주어야 이 예제가 동작하는 것을 볼 수 있다. 위도를 37.9로 살짝 수정해서 보내면 다음과 같이 지도가 이동한다. 실 장비에서는 장비를 들고 이동해야 현재 위치가 조사될 것이다.

 

 

dispatchTap 메서드에서는 현재 위치를 탭했을 때 토스트로 클릭을 받았음만 확인해 보았다. 이 메서드에서 true를 리턴하면 현재 위치에 대한 처리가 완료된 것으로 인식하여 현재 위치 표식이 사라져 버리므로 표식을 계속 유지하려면 false를 리턴해야 한다. 이 메서드를 재정의하기 위해 MyLocationOverlay2 클래스를 상속받았다.

나침반 기능도 켜 두기는 했지만 에뮬레이터에서는 나침반이 없을 뿐더러 DDMS에도 나침반 흉내 기능이 제공되지 않으므로 이 기능을 확인해 볼 방법이 없다. 실장비가 있어야만 방향 정보를 확인해 볼 수 있다. 실장비에서 실행하면 화면 우 하단에 빨간색 바늘을 가진 나침반이 나타나 현재 방향을 표시하며 장비를 회전시키면 나침반이 따라 움직인다.

 

 

[출처] - http://www.winapi.co.kr/android/

 

2010년 10월 21일 목요일

사람과 사람과의 관계속에 오는 엇갈린 오해로 인한 속상함

속상한 일이 생겼었는데

근데 미덥지 않지만 오해풀고

겨우겨우 속상함 지워냈는데

다시또 마음과 엇갈린 오해로

속상한 일이 발생할거 같아

느껴지는데 내가 어떻게 해야 할지 모르겟어

맞받아서 대할 수 있겟지만

그럴수록 점점 멀어지겟지

용기내서 내가 먼저 다가가야겟어

이것땜에 다른것에 신경쓸수 없어

용기가 필요해 ..  

2010년 10월 14일 목요일

TabWidget 각 페이지별 액티비티 보여주기 - 2

 

 

결과화면



main.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
        <TabWidget android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
            <FrameLayout android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        </FrameLayout>
    </LinearLayout>
</TabHost>

sub_layout1.xml / sub_layout2.xml / sub_layout3.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" >
  <TextView
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:textSize="20sp"
      android:gravity="center"
      android:text="Tab #"/>
</LinearLayout>

TabLayout.java file
package com.tablayout;

import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TabHost;

public class TabLayout extends TabActivity {
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        Resources res = getResources();
       
        //탭들을 품을 TabHost의 객체를 가져온다.
        //TabActivity를 확장했기 때문에 getTabHost() 사용한다.
        //Activity를 확장했다면 (TabHost)findViewById()를 사용해야 한다.
        TabHost tabHost = getTabHost();
       
        //각각의 탭이 지닐 기능을 정할 TabSpec 객체 등록
        TabHost.TabSpec spec;
       
        //각각의 탭이 어떤 Activity를 보여줄지 결정하는 정보를 담은 Intent 객체 등록
        Intent intent;  
       
        //이 Intent는 SubActivity1를 보여준다.
        intent = new Intent().setClass(this, SubActivity1.class);

        //새로운 Spec을 만들고 탭을 구별할 태그 등록
        spec = tabHost.newTabSpec("Tab1");

        //탭에 표시 될 문자아이콘을 등록
        //android.R.drawable에는 안드로이드에서 기본적으로 제공하는 drawable가 들어있다.
        spec.setIndicator("TAB1",res.getDrawable(android.R.drawable.ic_menu_agenda));

        //탭에 Intent 등록
        spec.setContent(intent);

        //TabHost에 첫번째 탭 등록
        tabHost.addTab(spec);
       
        //spec의 매소드들을 나열해서 코딩 가능
        intent = new Intent().setClass(this, SubActivity2.class);
        spec = tabHost.newTabSpec("Tab2").setIndicator("TAB2",
                                        res.getDrawable(android.R.drawable.ic_menu_edit)).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, SubActivity3.class);
        spec = tabHost.newTabSpec("Tab3").setIndicator("TAB3",
                                        res.getDrawable(android.R.drawable.ic_menu_help));.setContent(intent);
        tabHost.addTab(spec);
    }
}

SubActivity1.java / SubActivity2.java / SubActivity3.java
package com.tablayout;

import android.app.Activity;
import android.os.Bundle;

public class SubActivity1 extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub_layout#);
    }
}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.tablayout"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".TabLayout"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 사용할 Activity는 아래와 같이 꼭 등록해야 사용할 수 있다.
   android:name=".ActivityName" <- 이름앞에 꼭 . 을 써야 한다. -->
        <activity android:name=".SubActivity1" android:label="SubActivity1" />
        <activity android:name=".SubActivity2" android:label="SubActivity2" />
        <activity android:name=".SubActivity3" android:label="SubActivity3" />
    </application>


</manifest>



[출처] - http://androandro.tistory.com/4