문제점

안드로이드 스튜디오 베타버전에서 정식버전으로 교체하면서 기존의 프로젝트가 실행되지 않는다. 에러 메시지는 아래와 같다.

After Android Studio update: Gradle DSL method not found: 'runProguard()'

해결방안

아래 사진과 같이 runProguard를 minifyEnabled로 바꾸어 주어야 한다. gradle 버전이 바뀌면서 발생하는 에러같다.



참고사이트 Link

하나의 액티비티에 적용

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

전체 적용

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


문제점

Dialog를 화면에 띄우려고할 때, 발생하는 에러.

BadTokenException: Unable to add window -- token null is not for an application

해결방안

대화상자 객체 생성시 파라미터를 확인할 것.

getApplicationContext()를 사용하지 말고, 액티비티명.this를 사용할 것

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

AutoCompleteTextView 글자색 변경하기

문제점

AutoCompltetTextView 를 사용하는데 있어서 글자색이 하얀색으로 안보이고, textColor을 변경해도 적용되지 않는 문제


해결방안

res/layout 에 새로운 xml 파일을 생성하고 아래와 같이 작성한다.

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    style="?android:attr/dropDownItemStyle"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:padding="5dp"
    android:textAppearance="?android:attr/textAppearanceMediumInverse"
    android:textColor="#00f" />

Java 코드에서 어댑터를 추가할 때 위 레이아웃을 추가한다.

view = (AutoCompleteTextView)findViewById(R.id.text);        
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.my_list_item, data);
view.setAdapter(adapter);

layout.xml에는 아래와 같이 작성되어 있어야 한다.

<AutoCompleteTextView
    android:id="@+id/text"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:hint="Tapez votre 1texte"
    android:textColor="#000"        
    />

출처 링크


에러 - the method setbackgrounddrawable(drawable) from the type view is deprecated

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    setBackgroundDrawable()
} else {
    setBackground();
}

 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64

Handler 사용하기

안드로이드에서는 메인스레드가 아닌 다른 스레드(백그라운드)에서 UI를 건들였을 때 에러가 발생한다. 이는 서로 변경하는 것을 허용하게 되면 동기화 문제가 발생하기 때문이다. 그렇기 때문에 핸들러(Handler)를 사용해서 스레드간에 통신을 할 수 있다.


방법 1

방법 2


방법 3


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


1. 엑셀파일 변환하기



먼저 엑셀파일을 구분자로 나눠진 파일로 변환한다. 

(1)쉼표로 분리한 .csv 파일이나 (2)탭으로 분리된 텍스트파일중 상황에 맞게 할 수 있다.


2. SQLite DB에 import하기

1) 위에서 생성한 파일을 android SDK가 설치된 디렉토리 내 tools 폴더로 이동한다. 

그리고 커맨트 창을 띄우고 tools 폴더로 이동한다.



2) .db 파일을 생성한다. sqlite2.exe [db파일명] 으로 생성하거나 기본의 db파일을 읽어온다.

테이블을 생성하고 테이블을 확인해보았다.


DB 명령문


3) .separator "[구분자]" 명령어를 통해 구분자를 구분하고, .import [구분되어진 파일] [테이블명] 으로 데이터를 가져온다. import할 파일은 확장자까지 입력한다. 

데이터가 import되었는지 확인하기 위해서는 sqlite>select * from [테이블명]; 으로 확인한다.




액티비티의 생명주기

사진 출처(Android API)


  • 액티비티는 시작, 실행, 활성, 비활성화, 정지, 종료상태를 순환한다.
  • 시스템은 태스크[각주:1]의 실행중인 액티비티들을 스택으로 관리한다.


스택상의 액티비티의 세 가지 상태

  • 실행(active, running)
스택의 제일 위에 있는 상태로, 사용자가 화면으로 볼 수 있고,
입력 포커스를 가지며 사용자에게 입력을 받을 수 있는 상태이다.
  • 일시 정지(pause)
포커스는 잃었지만 사용자에게 일부 보이는 상태이다.
다 가리지 않았더나 반투명한 상태를 말한다.
  • 정지(stopped)
다른 액티비티에 의해 완전히 가려진 상태로, 사용자가 화면에서 볼 수 없다.
시스템은 메모리가 부족하면 정지 상태의 액티비티를 언제든지 강제 종료 가능하다.


참고자료, 사이트


  1. 태스크(Task)는 사용자가 실질적으로 "하나의 어플리케이션처럼" 느끼는 액티비티들의 집합. [본문으로]

 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


GoogleMaps v2 Marker 추가하기

구글맵이 화면에 올라와있다고 가정하에 아래 코드 작성.
LatLng loc = new LatLng(x, y); // 위치 좌표 설정
MarkerOptions marker = new MarkerOptions().position(loc);
mGoogleMap.addMarker(marker); // 마커표시
예제
public class MapTest extends FragmentActivity {

	// 초기화
	GoogleMap mGoogleMap; // 구글맵 객체
	LatLng loc = new LatLng(0, 0); // 위치 좌표 설정
	CameraPosition cp = new CameraPosition.Builder().target((loc)).zoom(16)
			.build();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_map_test);

		// 구글 맵 객체 생성
		mGoogleMap = ((SupportMapFragment) getSupportFragmentManager()
				.findFragmentById(R.id.map)).getMap();

		moveDisplay(35.864144, 129.194698, 19);
		addMarker(35.864144, 129.194698);


	// 마커 추가하기
	void addMarker(double x, double y) {
		LatLng loc = new LatLng(x, y); // 위치 좌표 설정
		MarkerOptions marker = new MarkerOptions().position(loc);
		mGoogleMap.addMarker(marker); // 마커표시
	}

	// 화면 이동하기
	void moveDisplay(double x, double y, int zoom) {
		LatLng loc = new LatLng(x, y); // 위치 좌표 설정
		CameraPosition cp = new CameraPosition.Builder().target((loc))
				.zoom(zoom).build();
		mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cp));
	}
}

GoogleMaps v2 Marker 삭제하기

dddd


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

  • 구글맵에 여러개의 마커를 추가하려고한다.
  • 이동경로를 표시하기 위해 마커를 사용하고, 마커를 찍는 방법은 다른 스레드를 생성하여 실행한다.


해결방안

구글맵의 문제가 아니었다. 안드로이드에서는 화면 UI를 변경하려면 하나의 액티비티에서만 가능하다.

그렇게 때문에 main이 아닌 다른 스레드에서 마커를 찍어주니 에러가 발생하였다.

그래서 Handler를 만들어주고 다른 Thread에서 호출하였다.


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


안드로이드 메일보내기

Intent it = new Intent(Intent.ACTION_SEND); String[] mailaddr = {"opid911@gmail.com"}; it.setType("plaine/text"); it.putExtra(Intent.EXTRA_EMAIL, mailaddr); // 받는사람 it.putExtra(Intent.EXTRA_SUBJECT, "[wisay]"); // 제목 it.putExtra(Intent.EXTRA_TEXT, "\n\n" + "v" + appVersion); // 첨부내용 startActivity(it);

받는주소에는 문자열배열이 아니면 안되는것 같다.


ListView에 Scrollbar 감추기

listview.xml

<ListView android:id="@+id/listview" ... android:scrollbars="none" >

ListView에 이동하는 스크롤바 적용하기(fast scroll)

listview.xml

<ListView android:id="@+id/listview" ... android:fastScrollEnabled="true" >


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TabHost
        android:id="@+id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1" >
            </FrameLayout>

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </TabHost>
</LinearLayout>

tabhost의 id가 @android:id/tabhost가 아닌 @+id/tabhost 이다.

위 tab은 FrameLayout 속성에 layout_weight="1" 때문에 하단에 위치하게 된다.


MainActivity.java

public class MainActivity extends ActivityGroup {
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		createTab();
	}

	private void createTab() {
		TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
		tabHost.setup(getLocalActivityManager());

		tabHost.addTab(tabHost.newTabSpec("TAB1").setIndicator("TAB1")
				.setContent(new Intent(this, Tab1Activity.class)));
		tabHost.addTab(tabHost.newTabSpec("TAB2").setIndicator("TAB2")
				.setContent(new Intent(this, Tab2Activity.class)));

		}

	}
}


참고 사이트



어플리케이션 버전 가져오기

// 어플 버전 가져오기
PackageInfo pi = null;
try {
	pi = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
	Log.e(TAG, e.getMessage());
}
String appVersion = pi.versionName;
Int appCode = pi.versionCode; 


자바코드(activity)에서 setText()로 값 변경시 태그넣기

TextView t1 = (TextView)findViewById(R.id.t1);
t1.setText(Html.fromHtml("1번째줄" + "<br />" + "2번째줄"));


자바코드(or Activity)에서 string.xml 값 가져오기

String st1 = getString(R.string.s1);
CharSequence st2 = getText(R.string.s2);


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


Google Maps Android API v2 (구글 맵) 사용하기


구글에서 제공하는 사용 방법(링크)


1. 구글맵 라이브러리 다운로드 및 프로젝트 생성하기

2. 새 프로젝트에서 구글맵 라이브러리 프로젝트 가져오기

3. 인증키 발급받기

 3-1. 디버깅용

  3-1-1. cmd창에서 확인하기

  3-1-2. 이클립스에서 확인하기

 3-2. 릴리즈용

4. 구글맵 인증키 발급받기

5. 구글맵 사용하기



1. 구글맵 라이브러리 다운로드 및 프로젝트 생성하기

 1-1. Google Play services SDK 다운로드하기

  Android SDK Manager - Google Play services 를 설치한다.


 1-2. 구글맵 라이브러리를 가져오기.

  1-2-1. Ctrl + N -> Android Project from Existing Code 를 선택한다.


  1-2-2. Root Directory 에 설치한 구글맵 라이브러리 경로를 지정해준다.

SDK경로\extras\google\google_play_services\libproject\google-play-services_lib



2. 구글맵을 사용할 새로운 프로젝트 생성하기.

  2-1. 프로젝트를 생성하고, 프로젝트를 오른쪽 클린한 후 Properties(속성)를 선택한다.

 


  2-2. 하단의 Library창에서 Add를 통해 가져온 프로젝트 추가해준다.





3. 인증키 발급받기

 3-1. 디버깅용 키 지문 확인하기.

  3-1-1. cmd(commend)창에서 확인하기.

1. OS별로 아래 경로로 이동

 OS X, Linux

  ~/.android

 윈도우 xp

  C:/Documents and Settings/사용자 계정/.android

 윈도우 7

  C:/Users/사용자 계정/.android


2. 명령어 실행

 keytool -v -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android

 혹은 -keystore 값에 경로를 함께 지정해도 된다.


  3-1-2. 이클립스에서 확인하기

   Window - Preferences -> Android - Build


 3-2. 릴리즈용

....


4. SHA1 지문으로 구글 키 발급받기

 4-1. Google APIs console로 이동한 뒤에 프로젝트를 생성한다.


4-2. 좌측 메뉴중 APIs & auth - APIs 에서 Google Maps Android API v2 를 찾아 활성화시켜준다.


 4-3. APIs & auth - Credentials 에서 Public API access의 CREATE NEW KEY를 선택하고, Android key를 선택한다.



 4-4. 아래와 같은 창이 나오면 위에서 확인했던 SH1키와 같이 현재 작업중인 패키지를 넣는다.

예) [SHA1지문];[현재 작업중인 패키지 이름]

AF:3B:EF:67:CE:A1:5C:7D:C2:3F:C4:99:8B:63:7F:F5:92:83:E2:11;com.example.googlemap_v2



 4-5. 아래와 같이 키가 발급되었다.


5. 구글 맵 사용하기(code)

 5-1. 매니페스트 설정하기.

  5-1-1. Manifest 탭


   5-1-2. Application 탭(Meta Data 2개를 추가해야 한다.)

   5-1-3. Permissions 탭

1개의 permission과 7개의 user-permission을 추가한다.

<permission
    android:name="com.example.maptest.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" >
</permission>
<uses-permission android:name="com.example.maptest.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



JAVA CODE

   5-1-4. AndroidManifest.xml에서 바로 추가할 수도 있다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.maptest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <permission
        android:name="com.example.maptest.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" >
    </permission>

    <uses-permission android:name="com.example.maptest.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.maptest.MapTest"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="KEY" />
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>

</manifest>


  5-2. layout에 fragment 추가하기

<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"
    tools:context=".MapTest" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    <fragment 
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment"/>

</RelativeLayout>


  5-3. MainActivity에 FragmentActivity 상속 받기

public class MainActivity extends FragmentActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@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;
	}

}


참고자료



자바캔에서 구현이 잘되어있어서 본문글 자체를 그래도 가져온 글입니다. 본문글은 이곳입니다.

(문제가 생긴다면 삭제하도록 하겠습니다.)


안드로이드에서 2회 연속 백버튼을 눌러서 앱을 종료시키는 경우가 흔한데, 이 기능은 많이 사용되므로 다음과 같이 별도 클래스로 기능을 분리하면 향후 기능 재사용이 편리하다.

public class BackPressCloseHandler {

	private long backKeyPressedTime = 0;
	private Toast toast;

	private Activity activity;

	public BackPressCloseHandler(Activity context) {
		this.activity = context;
	}

	public void onBackPressed() {
		if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
			backKeyPressedTime = System.currentTimeMillis();
			showGuide();
			return;
		}
		if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
			activity.finish();
			toast.cancel();
		}
	}


	private void showGuide() {
		toast = Toast.makeText(activity, "\'뒤로\'버튼을 한번 더 누르시면 종료됩니다.",
				Toast.LENGTH_SHORT);
		toast.show();
	}

}

BackPressCloseHandler의 구현은 간단하다.

  • backKeyPressedTime은 백버튼이 눌린 마지막 시간을 기록한다.
  • onBackPressed() 메서드는 현재 시간이 마지막 백버튼 누른 시간으로부터 
    • 2초 이상 지났으면, 마지막 백버튼 눌린 시간을 현재 시간으로 갱신하고 showGuide()를 실행한다.
    • 2초 이상 지나지 않았으면, Activity를 종료한다.
    • 참고로, 2초는 Toast.LENGTH_SHORT의 기본 값이다.
  • showGuide() 메서드는 Toast를 이용해서 메시지를 출력한다.

2회 연속 백버튼 누를 때 종료시키고 싶은 Activity가 있다면, 다음과 같이 사용한다.

  • BackPressCloseHandler 타입의  backPressCloseHandler 필드를 추가한다.
  • onCreate() 메서드에서 BackPressCloseHandler 객체를 생성해서 필드에 할당한다.
  • onBackPressed() 메서드에서 backPressCloseHandler.onBackPressed()를 호출한다.
아래 코드는 실제 적용한 코드의 일부를 발췌한 것이다.


public class HomeActivity extends Activity ... {

	private BackPressCloseHandler backPressCloseHandler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.home_layout);
		...
		backPressCloseHandler = new BackPressCloseHandler(this);
	}

	@Override
	public void onBackPressed() {
		backPressCloseHandler.onBackPressed();
	}
}


문제점

다이얼로그에서 버튼을 클릭하면 닫히는 것을 막으려고 한다. 
참고사이트

해결방안

기존 리스너는 버튼만 만들어주고 AlertDialog 객체를 통해 오버라이딩해서 사용한다. 
그리고 아래 조건문을 통해 dimiss()를 제어한다.

코드

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		tvName = (TextView) findViewById(R.id.tvName);
		btnClick = (Button) findViewById(R.id.btnClick);

		btnClick.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				dialogView = (View) View.inflate(asdasd.this, R.layout.dialog,
						null);

				AlertDialog.Builder builder = new AlertDialog.Builder(
						asdasd.this);
				builder.setMessage("Test input data");
				builder.setView(dialogView);
				builder.setPositiveButton("ok",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
							}
						});
				builder.setNegativeButton("clear",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
							}
						});
				final AlertDialog dialog = builder.create();
				dialog.show();

				dlg_edt_name = (EditText) dialogView
						.findViewById(R.id.dlg_edt_name);

				dialog.getButton(AlertDialog.BUTTON_POSITIVE)
						.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								Boolean wantToCloseDialog = true;

								tvName.setText(dlg_edt_name.getText());

								if (wantToCloseDialog)
									dialog.dismiss();
							}
						});
				dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
						.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								Boolean wantToCloseDialog = false;

								dlg_edt_name.setText("");

								if (wantToCloseDialog)
									dialog.dismiss();

							}
						});
			}
		});
	}


dialogExam.zip


ic_launcher(icon) size

사진 출처(링크)


drawable-hdpi 72 * 72
drawable-ldpi 32 * 32
drawable-mdpi 48 * 48
drawable-xhdpi 96 * 96
drawable-xxhdpi 144 * 144


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0

앱 등록이 업로드 실패 - 이미 버전 코드가 1인 APK가 있으므로 다른 버전 코드를 사용해야 합니다.


Version code 는 1이 아닌 값(2, 3, 4, 5, ...)로 바꾼다.

 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0

ImageButton Background 투명하게 만들기

위 사진과 같이 #00000000 로 변경한다.

 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.7.0_51

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0


문제점

안드로이드 설치나 업데이트중 SDK 버튼이 보이지 않을 때


해결방안


1. Window - Customize Perspective


2. Command Groups Availability 에서 Android SDK and AVD Manager 를 선택한다.


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.7.0_51

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


TabHost

여러 탭을 두고 각 탭을 클릭할 때마다 해당 화면이 나오도록 설정하는 뷰 컨테이너.

예제 결과

XML code

<LinearLayout 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:orientation="vertical" >

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1" >

                <LinearLayout
                    android:id="@+id/tab1"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#00ff00"
                    android:orientation="vertical" >

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="1" />
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/tab2"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#0000ff"
                    android:orientation="vertical" >

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="2" />
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/tab3"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#ff0000"
                    android:orientation="vertical" >

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="3" />
                </LinearLayout>
            </FrameLayout>

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
            </TabWidget>
        </LinearLayout>
    </TabHost>

</LinearLayout>

java code

package com.android_report;

import android.app.TabActivity;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;

public class MainActivity extends TabActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		TabHost tabHost = getTabHost();

		TabSpec tabSpecTab1 = tabHost.newTabSpec("TAB1").setIndicator("강아지");
		tabSpecTab1.setContent(R.id.tab1);
		tabHost.addTab(tabSpecTab1);

		TabSpec tabSpecTab2 = tabHost.newTabSpec("TAB2").setIndicator("고양이");
		tabSpecTab2.setContent(R.id.tab2);
		tabHost.addTab(tabSpecTab2);

		TabSpec tabSpecTab3 = tabHost.newTabSpec("TAB3").setIndicator("토끼");
		tabSpecTab3.setContent(R.id.tab3);
		tabHost.addTab(tabSpecTab3);

		TabSpec tabSpecTab4 = tabHost.newTabSpec("TAB4").setIndicator("말");
		tabSpecTab4.setContent(R.id.tab1);
		tabHost.addTab(tabSpecTab4);
		
		tabHost.setCurrentTab(0);

	}
}


12

+ Recent posts