2015년 11월 8일 일요일

android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 에러 문제





안드로이드에서 DB 작업을 하다보면 다음과 같은 에러를 만날 때가 있다.

"android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of ..."

이 에러는 DB에서 SELECT한 결과를 Cursor로 받는데 이때 Cursor의 위치가 첫번째 항목 바로 앞(index가 -1인) 위치에 놓이게 된다.
이때 다음 명령을 실행하면 

cursor.getString(cursor.getColumnIndex("name"));

android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1과 같은 에러가 발생한다.
왜냐하면 cursor의 위치가 before the first entry이기 때문이다. 즉 cursor의 index가 첫 번째 데이터 바로 앞인 -1의 위치에 있기 때문이다.

이건 다음 둘 중 한 방법으로 처리 해야한다.

1) cursor.moveToFirst()를 cursor.getString() 이전에 실행해서 index가 -1인 (첫 번째 항목 바로 앞) 위치에서 첫 번째 항목으로 이동시킨 후
cursor.getString(cursor.getColumnIndex("name"));
과 같은 명령을 통해 원하는 데이터를 추출하면 된다.

2) while문을 이용해서 cursor.moveToNext()를 이용해서 하면 moveToFirst()를 안 해도 된다.
이때 movetToFirst()를 실행하면 맨 첫번째 데이터를 놓치고 넘어가게 된다.
while(cursor.moveToNext()) {...}를 하면 index -1에서 cursor.moveToNext()로 인해
첫 번째 데이터 위치로 index가 옮겨가게 되므로 굳이 moveToFirst()가 필요 없게 된다.

while(cursor.moveToNext()) {
name = cursor.getString(cursor.getColumnIndex("name"));
}

아래는 코드 조각이다.

DBHelper db_Helper = new DBHelper(mContext);
SQLiteDatabase db = db_Helper.getReadableDatabase();
String sql = "SELECT * FROM "+mContext.getString(R.string.memberTable) 
+" WHERE "+mContext.getString(R.string.pinNum)+"='"+pin_num+"';";
//A Cursor object, which is positioned before the first entry.
Cursor cursor = db.rawQuery(sql, null);
//cursor.moveToFirst(); 
if (cursor.getCount() > 0) {
while(cursor.moveToNext()) {
name = cursor.getString(cursor.getColumnIndex("name"));
}
}
db_Helper.close();

2015년 11월 6일 금요일

CSS에서 가상 클래스(pseudo class)를 이용하여 링크에 마우스 동작 감지하는 법





CSS에서 가상 클래스(pseudo class)를 이용하여 링크에 마우스 동작 감지하는 법

웹 사이트의 링크에 마우스를 올리면 링크에 밑줄이 그어지면서 링크의 색상이 바뀌거나 혹은 이미 방문했던 링크는 다른 색상으로 변경되어 있어 사용자로 하여금 방문했던 곳인줄 인지하게 하는 기능이 있다. 이러한 기능은 아래의 가상 클래스(pseudo class)들을 이용해서 기능을 구현할 수 있다.
아래 가상 클래스들은 링크 뿐만아니라 버튼, input 컨트롤 등에도 적용이 가능하다.

:link
⇒ 아직 방문하지 않은 링크에 대해 스타일(색상, 글자 모양, 밑줄 등)을 지정하는 기능

:visited
⇒ 이미 방문했던 링크에 대해 스타일을 지정하는 기능

:hover
⇒ 사용자가 링크에 마우스를 올릴 때 다른 형태의 스타일을 갖도록 지정하는 기능

:activity
⇒ 링크가 현재 시점에서 활성화(activated)되고 있는 상태일때 스타일 지정하는 기능.
예를 들어서 버튼의 경우 눌려져 있는 시점, 링크의 경우는 마우스가 클릭되어 있는 시점을 의미한다. 짧은 순간 마우스를 눌렀다 떼기 때문에 스타일의 변화가 순간적으로 나타나지만 마우스를 롱 클릭해 보면 알수 있다.

:focus
⇒ element가 focus을 얻었을 때 스타일을 지정할수 있다.
focus란 입력 박스(input box)에 내용을 입력하기 위해 커서가 위치해 있을 때 입력 박스가 focus를 가진 상태이다. 혹은 키보드의 탭 키를 누를 때 focus가 이동하는데 이러한 방식으로도 element들이 focus를 가질수 있다. 
이렇게 focus를 가졌을 때 스타일을 지정할 수 있다.

가상 클래스를 사용할 때는 반드시 다음과 같은 순서로 CSS를 작성해야 한다.
:link → :visited → :hover → :focus → :active

아래는 CSS 코드 조각이다.

a:link {
color: deeppink;
text-decoration: none;}

a:visited {
color: black;}

a:hover {
color: deeppink;
text-decoration: underline;}

a:active {
color: darkcyan;}

2015년 11월 4일 수요일

안드로이드 전화번호 입력시 자동으로 dash(-) 붙이기





안드로이드 전화번호 입력시 자동으로 dash(-) 붙이기

전화번호를 입력할 때 01028910318과 같이 입력해도(-를 입력하지 않아도) 010-2891-0318과 같이 자동으로 자릿 수에 적당하게 -를 입력되게하는 기능이 안드로이드에서 제공된다. 
해당 클래스는 PhoneNumberFormattingTextWatcher이다.

TextView의 메소드 중 아래 메소드에 적용하면 된다.
public void addTextChangedListener (TextWatcher watcher)


EditText edPhone = 
            (EditText)findViewById(R.id.edPhone);

edPhone.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 
⇒ 이 메소드의 매개인자로 PhoneNumberFormattingTextWatcher가 올수 있는 이유는 
PhoneNumberFormattingTextWatcher가 TextWatcher 인터페이스를 구현했기 때문에 가능하다.

Git에 대해 배울수 있는 유용한 곳





형상관리 시스템(프로젝트 관리 시스템) Git에 대해 배울 수 있는 좋은 곳이다.

http://learnbranch.urigit.com/

2015년 11월 3일 화요일

BufferedReader에 대한 개념 세우기





BufferedReader에 대한 개념 세우기

BufferedReader는 인터넷에서 데이타를 읽어올 때 유용하다. 왜냐하면 인터넷은 원격에서 가져오기 때문에
속도가 늦을 수 있다. 따라서 버퍼를 이용해서 읽는 것이 필요하다.
따라서 BufferedReader의 객체를 생성하는 법을 아는 것은 요긴하다.

BufferedReader의 핵심은 이것이다.
InputStream이 입력을 위한 가장 기본인데 BufferedReader는 InputStream으로부터 버퍼에로
읽어온다는 개념이 BufferedReader의 핵심 개념이다. 
따라서 BufferedReader의 생성자 자체가 InputStream을 매개인자로 갖는다.

BufferedReader의 생성자를 보면 아래와 같이 2종류가 있다.

BufferedReader(Reader in)
BufferedReader(Reader in, int size)

1) 생성자(다른 것은 API 참조)
BufferedReader(Reader in)

2) Reader 클래스의 Known Direct Subclasses들은 다음과 같다
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

3) 따라서 BufferedReader의 생성자 매개인자로 InputStreamReader의 객체가 올수 있다.

4) InputStreamReader의 생성자(다른 것은 API 참조)
public InputStreamReader (InputStream in, Charset charset)
==> Charset charset는 한글 코드에 대한 디코딩 정보이다. 보통 웹은 euc-kr(2바이트 한글)이고 자바에서는 유니코드 체계인 utf-8이다

5) InputStreamReader의 객체를 생성할 수 있는 메소드
  -. URLConnection의 getInputStream();
  -. HttpURLConnection이 URLConnection을 상속받았기 때문에 여기서도 가능하다

callback 메소드가 있는 클래스의 객체 선언 법





callback 메소드가 있는 클래스의 객체 선언 법

abstract 클래스도 아니고 interface도 아닌 
일반 클래스임에도 콜백 메소드(시스템에 의해 자동 호출되는 메소드)가 있을 경우 abstract 클래스나 interface와 유사한 방식으로 객체를 생성을 할 수 있다. 
아래 두 경우를 보면 모두 일반 클래스이다.

public class Handler extends Object
public class PhoneStateListener extends Object

그런데 이들 클래스 안에 콜백 메서드를 사용하기 위해 다음과 같이 mHandler라는 객체를 다음과 같이 생성한다.

 Handler mHandler = new Handler(){ 
     @Override
     public void handleMessage(Message msg){ //이게 콜백 메소드
         //여기서 원하는 기능 수행
     }
  };


위의 handleMessage() 메소드는 핸들러로 메시가 들어올때 즉 이 핸들러 호출이 있을 때 시스템에 의해 이 메소드 호출된다.


PhoneStateListener mPhoneState = new PhoneStateListener(){
    public void onCallStateChanged(int state, String incomingNumber){ //이게 콜백 메소드이다.
    switch(state){
    case TelephonyManager.CALL_STATE_IDLE :
       txt.append("\n☆ 전화 상태 : 대기 상태");
       break;

    case TelephonyManager.CALL_STATE_OFFHOOK :
       txt.append("\n☆ 전화 상태 : 통화 중");
    break;

    case TelephonyManager.CALL_STATE_RINGING :
       txt.append("\n☆ 전화가 왔습니다 : " + incomingNumber);
       break;
      }
    }
    };


String을 byte[] 배열로 변환하는 법 - getBytes() 메소드에 대해






String을 byte[] 배열로 변환하는 법

String 문자열을 byte[] 배열로 바꾸는데는 String 클래스에서 제공하는 getBytes() 메소드를 이용하면 된다.
이 메소드는 overloading 된 4개의 메소드가 있다.

public byte[] getBytes ()
public byte[] getBytes (String charsetName)

첫 번째 메소드는 문자열을 byte[] 바꿀때 시스템의 디폴트 charset을 이용해서 변환한다.
두 번째 메소드는 지정된 charsetName으로 인코딩된 형태로 변환한다.

String str = "Hello world";
byte[] info = str.getBytes("utf-8");

한 프로그램에 여러 Activity가 있을 때 처음 실행되는 Activity 지정하는 법





한 프로그램에 여러 Activity가 있을 때 처음 실행되는 Activity 지정하는 법

보통 한 프로그램 안에 여러개의 Activity가 돌아간다. 
이때 어느 것을 main으로 설정하는지 다음과 같이 Menifest 파일에 등록해 주면 된다.

아래 적색 부분을 포함하고 있는 Activity가 프로그램 실행시 화면에 맨 처음 뜨게 된다.
여기서 AndExam.java가 Main으로 등록되어 있다.

        <activity android:name=".AndExam"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

안드로이드와 서버와의 통신에서 연결하는 절차





안드로이드와 서버와의 통신에서 연결하는 절차

-. URL로 연결할 지점에(접속할 주소) 대한 객체를 만든다. 

URL url = new URL("http://www.google.com");

※ URL이란 A Uniform Resource Locator that identifies the location of an Internet resource as specified by RFC 1738.

-. HttpURLConnection 클래스의 openConnection() 메소드로 해당 주소에 접속한다. 
이때 반환되는 객체가 URLConnection 클래스의 객체이다. 이때 프로토콜이 뭐냐에 따라 
HttpURLConnection, FtpURLConnection... 등이 반환 된다. 따라서 해당 프로토콜에 맞게 다운캐스팅해서 사용하면 된다.

HttpURLConnection httpURL = (HttpURLConnection)url.openConnection();

-. 해당 프로토콜에 필요한 각종 속성을 설정한다. API문서를 참조

httpURLCon.setConnectTimeout(10000);
httpURLCon.setUseCaches(false);

-. Http 연결일 경우는 요청방법을 지정해야 한다. 

httpURLCon.setRequestMethod("GET"); //이게 디폴트
httpURLCon.setRequestMethod("POST");

-. 모든 속성이 완료되면 서버에 요청을 보낸다. 요청이 무사히 전달됐으면 HTTP_OK(200)가 리턴된다. 반환되는 값에 대한 정보는 HttpURLConnection 클래스에 Constants로 잘 정의되어 있다.

httpURLCon.getResponseCode(); //public int getResponseCode ()

-. 다음과 같이 BufferedReader를 이용해서 서버에서 보내온 데이타를 읽는다.
BufferedReader 클래스는 생성자의 매개인자로 Reader 클래스의 객체가 와야 한다.
public BufferedReader (Reader in)
여기서 Reader클래스를 상속받은 클래스들이 BufferedReader, CharArrayReader, FilterReader, 
InputStreamReader, PipedReader, StringReader이다.
따라서 생성의 매개인자로 Reader클래스를 상속받은 하위 클래스의 객체가 올수있다. 
따라서 InputStreamReader 객체가 올 수 있다. 
InputStreamReader의 객체 생성은 생성자가 아래와 같이 되어 있다.

InputStreamReader(InputStream in) ==> InputStreamReader의 생성자. 매개인자로는 InputStream 객체가 올수 있다.
매개인자로 들어갈 InputStream 객체를 얻는 방법은 URLConnection의 메소드인 getInputStream()을 통해서 얻을 수 있다.

public InputStream getInputStream() ==> 이 메소드는 HttpURLConnection이 상속받은 상위 클래스인 URLConnection의 메소드인데 상속 

BufferedReader br = new BufferedReader(new InputStreamReader(httpURLCon.getInputStream()));
String temp = ""; //서버에서 보내온 데이터를 받을 공간

BufferedReader 클래스의 메소드 가운데 이런 편리한 메소드가 있다. 

public String readLine () 
      ⇒ Returns the next line of text available from this reader. 
          A line is represented by zero or more characters followed 
          by '\n', '\r', "\r\n" or the end of the reader. 
          The string does not include the newline sequence.
      ⇒ Returns : the contents of the line or null if no characters were read before the end of the reader has been reached.
      ⇒ 한 마디로 readLine() 메소드는 캐리지 리턴을 기준으로 한 라인씩 읽어서 String으로 반환한다.

다음과 같이 서버로 부터 보내온 데이터를 읽으면 된다.

String addr = "";
for(;;){
      temp = br.readLine();
      if (temp == null) 
         break;
      addr += temp;
}
       
br.close(); //다 읽었으면 닫아 준다.
httpURLCon.disconnect(); //연결을 끊어 준다.

네트워크에 연결하는 경우는 다양한 이유로 연결에 실패할 수 있기 때문에 각종 Exception이 발생할 수 있다. 이에 대해서는 API문서를 참조할 것.

안드로이드 내부 저장 공간에 디렉토리 생성 및 파일 생성 하기





폰의 저장 공간(외부 SD 카드가 아닌 디바이스 자체의 저장 공간)의 특정 디렉토리에 특정 파일을 저장하는 법.

특정 디렉토리는 MyDir
특정 파일 명은 MyImg.jpg라고 가정.

각 안드로이드 기기의 저장 공간에 대한 경로 명이 제조사 별로 상이하다.
따라서 저장 공간의 경로 명을 먼저 가져와야 된다. 아래 메소드를 이용해서

String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();

이렇게 얻어진 디바이스의 기본 경로에 내가 원하는 경로(MyDir)을 추가해 준다.

sdPath += "/MyDir";
이렇게 추가된 경로가 존재하지 않을 수 있기 때문에 존재 하지 않는다면 이 디렉토리를 새로 생성해 준다.

File file = new File(sdPath);
file.mkdirs(); //없으면 디렉토리 생성, 있으면 통과

이제 내가 생성하고자 하는 파일을 생성한다.

sdPath += "/MyImg.jpg";

이 파일도 존재하지 않는 파일이기에 File 클래스의 createNewFile() 메소드를 통해 새로 생성한다.

file = new File(sdPath);
try {
   file.createNewFile();
   Toast.makeText(mContext, "이미지 디렉토리 및 파일생성 성공~", 1).show();
} catch(IOException ie){
   Toast.makeText(mContext, "이미지 디렉토리 및 파일생성 실패", 1).show();
}

아래는 소스 조각이다.

String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
sdPath += "/MyDir";
File file = new File(sdPath);
file.mkdirs();

sdPath += "/MyImg.jpg";

file = new File(sdPath);
try {
  file.createNewFile();
  Toast.makeText(mContext, "이미지 디렉토리 및 파일생성 성공~", 1).show();
} catch(IOException ie){
  Toast.makeText(mContext, "이미지 디렉토리 및 파일생성 실패", 1).show();
}

2015년 11월 2일 월요일

안드로이드 ProgressDialog 만들기





안드로이드 ProgressDialog 만들기

생상자가 아래와 같이 2가지 형태가 있다.

ProgressDialog(Context context)
ProgressDialog(Context context, int theme)

첫 번째는 디폴트 형태로 만드는 방식이고 두 번째는 다이알로그의 형태(배경 색, 모양, 크기...)를 두 번째 매개인자가 지정하는 형태(theme)대로 만드는 방식이다.

theme에는 다음과 같은 형태들이 있다.

//검정색 바탕에 흰 글씨(폭이 좁은 형태)
ProgressDialog pDialog = new ProgressDialog(TestActivity.this, AlertDialog.THEME_HOLO_DARK); 
       
//흰색 바탕에 검정색 글씨(폭이 좁은 형태)
ProgressDialog pDialog = new ProgressDialog(TestActivity.this, AlertDialog.THEME_HOLO_LIGHT); 
       
//검정색 바탕에 흰 글씨(폭이 넓은 형태)
ProgressDialog pDialog = new ProgressDialog(TestActivity.this, AlertDialog.THEME_TRADITIONAL); 
       
//장비의 안드로이드 버전에 따른 형태(검정색 바탕)
ProgressDialog pDialog = new ProgressDialog(TestActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_DARK);
       
//장비의 안드로이드 버전에 따른 형태(흰색 바탕)
ProgressDialog pDialog = new ProgressDialog(TestActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);



이들 Theme은 AlertDialog 클래스에 정의되어 있다. 그런데 안드로이드 버전 23부터는 대부분 deprecated되었다.
아래는 코드 조각이다.

ProgressDialog pDialog = new ProgressDialog(TestActivity.this);
pDialog.setCancelable(true);
//pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); //직선 막대그래프 형태
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); //원형 형태
//pDialog.setTitle("등록 상황"); //타이틀
pDialog.setMessage("잠시만 기다리세요...");
pDialog.show();

EditText의 값을 숫자로만 제한할 경우 xml에서 처리 법





EditText의 값을 숫자로만 제한할 경우 xml에서 처리 법

      <EditText 
          android:id="@+id/won1"
          android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:selectAllOnFocus="true"
        android:inputType="number"
           android:textSize="25sp"
        />

안드로이드에서 xml로 배열 선언하는 법





안드로이드에서 xml로 배열 선언하는 법

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="person">
        <item>홍길동</item>
        <item>고길동</item>
        <item>박길동</item>
        <item>김길동</item>
    </string-array>
</resources>

이 파일의 위치는 res/values 폴더 아래에 위치시키면 된다.

이클립스를 통해서 생성시 해당 프로젝트/res/values에서 마우스 우측 클릭 ⇒ 팝업창에서 New ⇒ Other ⇒ Android 항목의 하위 항목 중 Android XML Values File 선택 ⇒ 원하는 파일명 지정 및 작성











HTML5에 대한 생각 조각





그 동안의 HTML(HTML4)은 웹에서 문서를 표현하기 위한 수단이었다면
이제 HTML5는 웹에서 프로그램(앱)을 개발하기 위한 방향을 지향점으로 하고 있다는 것,
앱 개발 플랫폼을 목표로 한 녀석이라는 것,
HTML5는 단순히 웹 기술을 지향하지 않고 모든 IT 기술이 웹으로 연결되는 것에 기반을 두고 있다는 점.
음... 이것이 HTML5와 관련된 비밀 아닌 비밀 쯤 되겠구나...

아래 글로부터의 작은 생각 조각이었습니다.

http://www.itdaily.kr/news/articleView.html?idxno=70674

2015년 11월 1일 일요일

코딩에서 컬러 값 설정시 참고하는 사이트(COLOR PICKER)





프로그램을 개발하다 보면 글자 색깔이나 배경색 등 컬러 값을 16진수 값으로 설정해야 할때가 있다.
컬러 값을 미세하게 조정해야 한다거나 등등...
이때 자주 사용하는 사이트이다.

http://www.w3schools.com/tags/ref_colorpicker.asp


LayoutInflater 객체를 얻는 3가지 방법





LayoutInflater 객체를 얻는 3가지 방법

LayoutInflater는 레이아웃 XML 파일로부터(XML로 작성된 layout 파일로부터) 그에 해당하는 View 객체를 획득하는데 유용하게 사용되는 클래스이다.
현재의 레이아웃 view에(setContentView()로 얻은 view에) 동적으로 특정 layout XML 파일의 내용을 view에 추가하고 싶을 때 유용하게 사용이 된다.
다음과 같이 3가지 방식으로 객체를 얻을수 있다.


  • LayoutInflater inflater = 
                    (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);


  • LayoutInflater inflater = Activity.getLayoutInflater();


  • LayoutInflater inflater = LayoutInflater.from(Context context);


내가 작성한 TextView를 AlertDialog에 채용해서 내가 원하는 형태로 AlertDialog를 보여주고자 할 경우 
아래와 같이 LayoutInflater를 이용하면 된다.

alert_text.xml의 내용이 다음과 같을 경우 

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spnTxt"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="15dp"
    android:textColor="#FF99FF"
    android:textSize="20sp"
    />

이 레이아웃(alert_text.xml)을 AlertDialog의 view로 사용 할려면 LayoutInflater를 이용해서 다음과 같이 하면 된다.

LayoutInflater inflater = 
         (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

TextView spnTxt = (TextView)inflater.inflate(R.layout.alert_text, null);
spnTxt.setText("필요한 문자열...");

AlertDialog.Builder adb = new AlertDialog.Builder(this);
adb.setView(spnTxt);
adb.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//원하는 기능
}
)};

adb.show();

안드로이드에서 JSON으로 보낸 데이터를 PHP에서 수신하기





안드로이드에서 JSON으로 보낸 데이터를 PHP에서 수신하기

$value = json_decode() 함수를 이용한다.

$value = json_decode(file_get_contents('php://input'));

입력된 JSON 값을 출력해 볼려면

$value = json_encode($value);
echo("JSON 데이터 : ".$value);


CSS 텍스트에 밑줄, 가운데 줄, 윗 줄 표시하기





CSS 텍스트에 밑줄, 가운데 줄, 윗 줄 표시하기

▶ text-decoration 속성 
  개념 : CSS에서 텍스트에 밑줄, 가운데줄, 윗줄 표시하기위한 속성
  none : 기존에 적용되었던 decoration을 제거
  underline : 밑줄 긋기
  overline : 텍스트의 윗쪽에 line 긋기
  line-through : 텍스트 가운데 line 긋기(취소 선)
  blink : 텍스트 깜빡이게(시각적으로 혼란스럽게 하는 면이 있어 잘 사용 안함)


예)

h2 {
   text-decoration: underline;
}

.info {
   text-decoration: line-through;
}

2015년 10월 29일 목요일

안드로이드 xml에 마크업 문자 넣기(글꼴 속성: 굵기, 이탤릭...)





안드로이드 xml에 마크업 문자 넣기(글꼴 속성: 굵기, 이탤릭...)

안드로이드는 HTML처럼 XML 문자열에서 기본적인 마크업 문자를 사용하여 스팬 문자를 만들수 있는 기능을 아래와 같이 제공한다.


  •  <b>굵게 강조</b>
  •  <i>이탤리체</i>
  •  <tt>프로그램용 MonoSpace 폰트</tt>
  •  <sup>윗첨자</sup>
  •  <sub>아래첨자</sub>
  •  <u>아래밑줄</u>
  •  <strike>취소선</strike>


<TextView 
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:gravity="center_horizontal"
   android:text="@string/styled_text"/>

strings.xml의 내용

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, AAAActivity!</string>
    <string name="styled_text">평범(plain), \n<b>굵게(bold)</b>, \n<i>이탤릭체(italic)
                         </i>, \n<b><i>여긴 굵게 이탤릭체</i></b>
    </string>

    <string name="app_name">안드로이드 리소스 샘플 프로첵트</string>
</resources>

Map과 List에 대한 간단한 이해





Map과 List에 대한 간단한 이해

List는 원소들을 가지고 있는 데이터 집합이다. 순차 자료구조로 순차적으로 메모리에 저장되는 형태이다. 쉽게 배열로 바꾸어서 생각해도 된다. 
따라서 List의 원소에 접근할 때는 index(첨자)로 접근한다.

List는 Generic이라는 옵션이 존재하는데 Generic 옵션이 설정된 List는 Generic에 해당되는 데이터 형만을 담을 수 있다.

List<Integer> myList = new ArrayList<Integer>();

위와 같이 선언된 List는 Generic 옵션으로 Integer 형을 받았다.
myList에 add할 수 있는 자료들은 Integer형의 데이터만 담을 수 있게 된다.

myList.add("data")와 같이 문자열을 넣으려 한다면 에러가 발생하게 된다.

myList.get(i)과 myList.remove(i) 메소드를 사용해서 myList 안에 있는 원소들을 인텍스로 접근, 삭제 등을 할수 있다.

Map은 List와 같은 원소들을 모아 놓은 집합이다.
List와는 달리 index(첨자)로 접근하는 것이 아니라 key로써 데이터를 제어할수 있다.
Map 또한 Generic 옵션을 설정할 수 있다.

Map<String, Object> myMap = new HashMap<String, Object>();
와 같이 Generic을 key와 data형으로 지정한다.

myMap.put("elementA", "Data_1");
과 같은 형태로 String의 key로 myMap에 저장된 Object 데이타를 제어할 수 있게 되며 Generic 형식에 따라야 한다.

put으로 저장된 데이터는 put할 때 지정했던 key로 접근이 가능하며
myMap.get("elementA")을 호출하면 저장된 "Data_1"이 반환된다.
myMap.remove("elementA")을 호출하면 해당하는 key를 가진 원소가 삭제된다.