배경 패턴이미지 적용

프로그래밍/Android (Java)|2015. 1. 27. 11:04
반응형

패턴이미지를 LinearLayout 의 background 속성에 적용을 하면 전체화면에 맞게 늘어난다.
원래 크기의 패턴 이미지를 반복해서 백그라운드에 뿌려주고 싶을때 아래와 같이 한다.

drawable 폴더에 pattern_bg.xml 파일을 생성한 후 아래 코드를 삽입.

1
2
3
4
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/pattern_image"
    android:tileMode="repeat"
/>


이제 적용할 Activity의 LinearLayout 속성에 위 XML 파일을 적용한다.

1
2
3
4
5
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/pattern_bg">
</LinearLayout>

[출처] 아마그래머 (http://shstarkr.tistory.com/160)

반응형

댓글()

자바 날짜/시간 계산 예제 코드 (다양한 예제) 2

프로그래밍/Android (Java)|2015. 1. 27. 11:04
반응형

파일에서 날짜정보를 가져오기

File f = new File ( directory, file );
Date date = new Date ( f.lastModified ( ) );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( date );
 
System.out.println("Year : " + cal.get(Calendar.YEAR));
System.out.println("Month : " + (cal.get(Calendar.MONTH) + 1));
System.out.println("Day : " + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("Hours : " + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("Minutes : " + cal.get(Calendar.MINUTE));
System.out.println("Second : " + cal.get(Calendar.SECOND));

날짜형식으로 2000-01-03으로 처음에 인식을 시킨후
7일씩 증가해서 1년정도의 날짜를 출력해 주고 싶은데요.

SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-mm-dd" );
Calendar c = Calendar.getInstance ( );
for ( int i = 0; i < 48; i++ )
{
    c.clear ( );
    c.set ( 2000, 1, 3 - ( i * 7 ) );
    java.util.Date d = c.getTime ( );
    String thedate = sdf.format ( d );
    System.out.println ( thedate );
}

쓰레드에서 날짜 바꾸면 죽는 문제

Main화면에 날짜와시간이Display되는 JPanel이 있습니다.
date로 날짜와 시간을 변경하면 Main화면의 날짜와 시간이 Display되는 Panel에 
변경된 날짜가 Display되지 않고 Main화면이 종료되어 버립니다.

문제소스:

public void run ( )
{
    while ( true )
    {
        try{
            timer.sleep ( 60000 );
        }
        catch ( InterruptedException ex ) { }
     
        lblTimeDate.setText ( fGetDateTime ( ) );
        repaint ( );
    }
}
 
public String fGetDateTime ( )
{
    final int millisPerHour = 60 * 60 * 1000;
    String DATE_FORMAT = "yyyy / MM / dd HH:mm";
    SimpleDateFormat sdf = new SimpleDateFormat ( DATE_FORMAT );
    SimpleTimeZone timeZone = new SimpleTimeZone ( 9 * millisPerHour, "KST" );
    sdf.setTimeZone ( timeZone );<p></p>
    long time = System.currentTimeMillis ( );
    Date date = new Date ( time );
    return sdf.format ( date );
}

해답:

// 날짜와 요일 구한다. timezone 으로 날짜를 다시 셋팅하시면 됨니다.
public String getDate ( )
{
    Date now = new Date ( );
    SimpleDateFormat sdf4 = new SimpleDateFormat ( "yyyy/MM/dd HH:mm EE" );
    sdf4.setTimeZone ( TimeZone.getTimeZone ( "Asia/Seoul" ) );
    return sdf4.format ( now );
}

날짜와 시간이 유효한지 검사하려면...?

import java.util.*;
import java.text.*;
 
public class DateCheck
{
    boolean dateValidity = true;
     
    DateCheck ( String dt )
    {
    try
    {
    DateFormat df = DateFormat.getDateInstance ( DateFormat.SHORT );
    df.setLenient ( false );
    Date dt2 = df.parse ( dt );
    }
    catch ( ParseException e ) { this.dateValidity = false; }
    catch ( IllegalArgumentException e ) { this.dateValidity = false; }
    }
 
    public boolean datevalid ( )
    {
        return dateValidity;
    }
 
    public static void main ( String args [] )
    {
        DateCheck dc = new DateCheck ( "2001-02-28" );
        System.out.println ( " 유효한 날짜 : " + dc.datevalid ( ) );
    }
}

두 날짜 비교하기(아래보다 정확)

그냥 날짜 두개를 long(밀리 세컨드)형으로 비교하시면 됩니다...

이전의 데이타가 date형으로 되어 있다면, 이걸 long형으로 변환하고.
현재 날짜(시간)은 System.currentTimeMillis()메소드로 읽어들이고,
두수(long형)를 연산하여 그 결과 값으로 비교를 하시면 됩니다.

만약 그 결과값이 몇시간 혹은 며칠차이가 있는지를 계산할려면,
결과값을 Calender의 setTimeInMillis(long millis) 메소드를 이용해
설정한다음 각각의 날짜나 시간을 읽어오시면 됩니다

두 날짜 비교하기2

import java.util.*;
import java.util.Calendar.*;
import java.text.SimpleDateFormat;
 
public class DayComparisonTest
{
    public static void main(String args[])
    {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd");
        Calendar aDate = Calendar.getInstance();
        // 비교하고자 하는 임의의 날짜
        aDate.set(2001, 0, 1);
        Calendar bDate = Calendar.getInstance();
        // 이것이 시스템의 날짜
 
        // 여기에 시,분,초를 0으로 세팅해야 before, after를 제대로 비교함
        aDate.set( Calendar.HOUR_OF_DAY, 0 );
        aDate.set( Calendar.MINUTE, 0 );
        aDate.set( Calendar.SECOND, 0 );
        aDate.set( Calendar.MILLISECOND, 0 );
        bDate.set( Calendar.HOUR_OF_DAY, 0 );
        bDate.set( Calendar.MINUTE, 0 );
        bDate.set( Calendar.SECOND, 0 );
        bDate.set( Calendar.MILLISECOND, 0 );
 
        if (aDate.after(bDate))
            // aDate가 bDate보다 클 경우 출력
            System.out.println("시스템 날짜보다 뒤일 경우 aDate = " + dateForm.format(aDate.getTime()));
        else if (aDate.before(bDate))
            // aDate가 bDate보다 작을 경우 출력
            System.out.println("시스템 날짜보다 앞일 경우 aDate = " + dateForm.format(aDate.getTime()));
        else
            // aDate = bDate인 경우
            System.out.println("같은 날이구만");
    }
}


[출처] 서비의 다락방 (www.yunsobi.com/blog/325)

반응형

댓글()

자바 날짜/시간 계산 예제 코드 (다양한 예제)

프로그래밍/Android (Java)|2015. 1. 27. 11:04
반응형

시스템의 밀리초 구하기.(국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각)

// 밀리초 단위(*1000은 1초), 음수이면 이전 시각
long time = System.currentTimeMillis ( );
System.out.println ( time.toString ( ) );

현재 시각을 가져오기.

Date today = new Date ();
System.out.println ( today );


결과 : Sat Jul 12 16:03:00 GMT+01:00 2000

경과시간(초) 구하기

long time1 = System.currentTimeMillis ();
long time2 = System.currentTimeMillis ();
system.out.println ( ( time2 - time1 ) / 1000.0 );

Date를 Calendar로 맵핑하기

Date d = new Date ( );
Calendar c = Calendar.getInstance ( );
c.setTime ( d );

날짜(년/월/일/시/분/초) 구하기

import java.util.*;
import java.text.*;
SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy.MM.dd HH:mm:ss", Locale.KOREA );
Date currentTime = new Date ( );
String dTime = formatter.format ( currentTime );
System.out.println ( dTime );

날짜(년/월/일/시/분/초) 구하기2

GregorianCalendar today = new GregorianCalendar ( );
int year = today.get ( today.YEAR );
int month = today.get ( today.MONTH ) + 1;
int yoil = today.get ( today.DAY_OF_MONTH ); <p></p>
<p>GregorianCalendar gc = new GregorianCalendar ( );</p>
<p>System.out.println ( gc.get ( Calendar.YEAR ) );
System.out.println ( String.valueOf ( gc.get ( Calendar.MONTH ) + 1 ) );
System.out.println ( gc.get ( Calendar.DATE ) );
System.out.println ( gc.get ( DAY_OF_MONTH ) );
</p>

날짜(년/월/일/시/분/초) 구하기3

DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
Calendar cal = Calendar.getInstance(Locale.KOREA);
nal = df.format(cal.getTime());

- 표준시간대를 지정하고 날짜를 가져오기.

TimeZone jst = TimeZone.getTimeZone ("JST");
Calendar cal = Calendar.getInstance ( jst );
// 주어진 시간대에 맞게 현재 시각으로 초기화된 GregorianCalender 객체를 반환.
// 또는 Calendar now = Calendar.getInstance(Locale.KOREA);
System.out.println ( cal.get ( Calendar.YEAR ) + "년 "
                    + ( cal.get ( Calendar.MONTH ) + 1 ) + "월 "
                    + cal.get ( Calendar.DATE ) + "일 "
                    + cal.get ( Calendar.HOUR_OF_DAY ) + "시 "
                    + cal.get ( Calendar.MINUTE ) + "분 "
                    + cal.get ( Calendar.SECOND ) + "초 "
                    );


결과 : 2000년 8월 5일 16시 16분 47초

영어로된 날짜를 숫자로 바꾸기

Date myDate = new Date ( "Sun,5 Dec 1999 00:07:21" );
System.out.println ( myDate.getYear ( ) + "-" + myDate.getMonth ( ) + "-" + myDate.getDay ( ) );

"Sun, 5 Dec 1999 00:07:21"를 "1999-12-05"로 바꾸기

SimpleDateFormat formatter_one = new SimpleDateFormat ( "EEE, dd MMM yyyy hh:mm:ss",Locale.ENGLISH );
SimpleDateFormat formatter_two = new SimpleDateFormat ( "yyyy-MM-dd" );
String inString = "Sun, 5 Dec 1999 00:07:21";
ParsePosition pos = new ParsePosition ( 0 );
Date frmTime = formatter_one.parse ( inString, pos );
String outString = formatter_two.format ( frmTime );
System.out.println ( outString );

숫자 12자리를, 다시 날짜로 변환하기

Date conFromDate = new Date();
long ttl = conFromDate.parse ( "Dec 25, 1997 10:10:10" );
System.out.println ( ttl );
//예 938291839221
Date today = new Date ( ttl );
DateFormat format = DateFormat.getDateInstance ( DateFormat.FULL,Locale.US );
String formatted = format.format ( today );
System.out.println ( formatted );

특정일로부터 n일 만큼 이동한 날짜 구하기

특정일의 시간을 long형으로 읽어온다음..
날짜*24*60*60*1000 을 계산하여.
long형에 더해줍니다.
그리고 나서 Date클래스와 Calender클래스를 이용해서 날짜와 시간을 구하면 됩니다

특정일에서 일정 기간후의 날짜 구하기2

//iDay 에 입력하신 만큼 빼거나 더한 날짜를 반환 합니다.
import java.util.*;
public String getDate ( int iDay )
{
    Calendar temp=Calendar.getInstance ( );   
    temp.add ( Calendar.DAY_OF_MONTH, iDay );
     
    int nYear = temp.get ( Calendar.YEAR );
    int nMonth = temp.get ( Calendar.MONTH ) + 1;
    int nDay = temp.get ( Calendar.DAY_OF_MONTH );
     
    StringBuffer sbDate=new StringBuffer ( );
    sbDate.append ( nYear );
     
    if ( nMonth < 10 )
        sbDate.append ( "0" );
        sbDate.append ( nMonth );
 
    if ( nDay < 10 )
        sbDate.append ( "0" );
        sbDate.append ( nDay );
 
    return sbDate.toString ( );
}

현재날짜에서 2달전의 날짜를 구하기

//오늘 날짜를 기준으루..
Calendar cal = Calendar.getInstance ( );
//2개월 전....
cal.add ( cal.MONTH, -2 );
 
System.out.println ( cal.get ( cal.YEAR ) );
System.out.println ( cal.get ( cal.MONTH ) + 1 );
System.out.println ( cal.get ( cal.DATE ) );

달에 마지막 날짜 구하기

for ( int month = 1; month <= 12; month++ )
{
    GregorianCalendar cld = new GregorianCalendar ( 2001, month - 1, 1 );
    System.out.println ( month + "/" + cld.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
}

해당하는 달의 마지막 일 구하기

GregorianCalendar today = new GregorianCalendar ( );
int maxday = today.getActualMaximum ( ( today.DAY_OF_MONTH ) );
System.out.println ( maxday );

특정일을 입력받아 해당 월의 마지막 날짜를 구하는 간단한 예제.(달은 -1 해준다.)...윤달 30일 31일 알아오기.

Calendar cal = Calendar.getInstance ( );
cal.set ( Integer.parseInt ( args[0] ), Integer.parseInt ( args [1] ) - 1, Integer.parseInt ( args [2] ) );
SimpleDateFormat dFormat = new SimpleDateFormat ( "yyyy-MM-dd" );
System.out.println ( "입력 날짜 " + dFormat.format ( cal.getTime ( ) ) );
System.out.println ( "해당 월의 마지막 일자 : " + cal.getActualMaximum ( Calendar.DATE ) );

해당월의 실제 날짜수 구하기 ( 1999년 1월달의 실제 날짜수를 구하기 )

Calendar calendar = Calendar.getInstance ( );
calendar.set ( 1999, 0, 1 );
int maxDays = calendar.getActualMaximum ( Calendar.DAY_OF_MONTH );

어제 날짜 구하기

오늘날짜를 초단위로 구해서 하루분을 빼주고 다시
셋팅해주면 쉽게 구할수 있죠..
setTime((기준일부터 오늘까지의 초를 구함) - 24*60*60)해주면 되겠죠..

어제 날짜 구하기2

import java.util.*;
public static Date getYesterday ( Date today )
{
    if ( today == null )
        throw new IllegalStateException ( "today is null" );
 
    Date yesterday = new Date ( );
    yesterday.setTime ( today.getTime ( ) - ( (long) 1000 * 60 * 60 * 24 ) );
     
    return yesterday;
}

내일 날짜 구하기

Date today = new Date ( );
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) );

내일 날짜 구하기2

Calendar today = Calendar.getInstance ( );
today.add ( Calendar.DATE, 1 );
Date tomorrow = today.getTime ( );

오늘날짜에서 5일 이후 날짜를 구하기

Calendar cCal = Calendar.getInstance();
c.add(Calendar.DATE, 5);

날짜에 해당하는 요일 구하기

//DAY_OF_WEEK리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다.
//아래 소스는 JSP일부입니다.
import java.util.*;
Calendar cal= Calendar.getInstance ( );
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );
if ( day_of_week == 1 )
    m_week="일요일";
else if ( day_of_week == 2 )
    m_week="월요일";
else if ( day_of_week == 3 )
    m_week="화요일";
else if ( day_of_week == 4 )
    m_week="수요일";
else if ( day_of_week == 5 )
    m_week="목요일";
else if ( day_of_week == 6 )
    m_week="금요일";
else if ( day_of_week == 7 )
    m_week="토요일";

콤보박스로 선택된 날짜(예:20001023)를 통해 요일을 영문으로 가져오기

//gc.get(gc.DAY_OF_WEEK); 하면 일요일=1, 월요일=2, ..., 토요일=7이 나오니까,
//요일을 배열로 만들어서 뽑아내면 되겠죠.
GregorianCalendar gc=new GregorianCalendar ( 2000, 10 - 1 , 23 );
String [] dayOfWeek = { "", "Sun", "Mon", .... , "Sat" };
String yo_il = dayOfWeek ( gc.get ( gc.DAY_OF_WEEK ) );

두 날짜의 차이를 일수로 구하기

각각의 날짜를 Date형으로 만들어서 getTime()하면 
long으로 값이 나오거든요(1970년 1월 1일 이후-맞던가?- 1/1000 초 단위로..)
그러면 이값의 차를 구해서요. (1000*60*60*24)로 나누어 보면 되겠죠.

두 날짜의 차이를 일수로 구하기2

import java.io.*;
import java.util.*;
 
 
Date today = new Date ( );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( today );
 
// 오늘로 설정.
Calendar cal2 = Calendar.getInstance ( );
cal2.set ( 2000, 3, 12 );
 
// 기준일로 설정. month의 경우 해당월수-1을 해줍니다.
int count = 0;
while ( !cal2.after ( cal ) )
{
    count++;
    cal2.add ( Calendar.DATE, 1 );
    //다음날로 바뀜
    System.out.println ( cal2.get ( Calendar.YEAR ) + "년 "
            + ( cal2.get ( Calendar.MONTH ) + 1 )
            + "월 " + cal2.get ( Calendar.DATE ) + "일"
    );
}
System.out.println ( "기준일로부터 " + count + "일이 지났습니다." );

두 날짜의 차이를 일수로 구하기3

import java.io.*;
import java.util.*;
public class DateDiff
{
    public static int GetDifferenceOfDate ( int nYear1, int nMonth1, int nDate1, int nYear2, int nMonth2, int nDate2 )
    {
        Calendar cal = Calendar.getInstance ( );
        int nTotalDate1 = 0, nTotalDate2 = 0, nDiffOfYear = 0, nDiffOfDay = 0;
        if ( nYear1 > nYear2 )
        {
            for ( int i = nYear2; i < nYear1; i++ )
            {
                cal.set ( i, 12, 0 );
                nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
            }
            nTotalDate1 += nDiffOfYear;
        }
        else if ( nYear1 < nYear2 )
        {
            for ( int i = nYear1; i < nYear2; i++ )
            {
                cal.set ( i, 12, 0 );
                nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
            }
            nTotalDate2 += nDiffOfYear;
        }
         
        cal.set ( nYear1, nMonth1-1, nDate1 );
        nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
        nTotalDate1 += nDiffOfDay;
        cal.set ( nYear2, nMonth2-1, nDate2 );
        nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
        nTotalDate2 += nDiffOfDay;
         
        return nTotalDate1-nTotalDate2;
    }
     
    public static void main ( String args[] )
    {
        System.out.println ( "" + GetDifferenceOfDate (2000, 6, 15, 1999, 8, 23 ) );
    }
}


[출처] 서비의 다락방 (www.yunsobi.com/blog/325)

반응형

댓글()

액션바에 overflow 메뉴 생성하기

프로그래밍/Android (Java)|2015. 1. 27. 11:03
반응형

안드로이드 스마트폰은 대부분 '메뉴'버튼을 가지고 있습니다.

이 메뉴 버튼이 있을 경우 액션바에 overflow 메뉴가 나타나지 않고 메뉴 버튼을 누를때

하단에서부터 메뉴가 출력 되는데요, 이를 방지하고 무조건 overflow 메뉴가 나타나도록 할 수 있습니다.



res/menu/menu.xml


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

    <item

        android:id="@+id/action_refresh"

        android:showAsAction="ifRoom"

        android:title="새로고침"

        android:icon="@android:drawable/ic_menu_rotate" />

    <item

        android:id="@+id/action_loadyet"

        android:showAsAction="ifRoom"

        android:title="미수신 메세지 가져오기"

        android:icon="@android:drawable/ic_menu_recent_history" />

    <item

        android:id="@+id/action_clear"

        android:title="지우기" />

    <item

        android:id="@+id/action_setting"

        android:title="환경 설정" />

</menu> 



MainActivity.java


import android.view.Menu;

import android.view.MenuInflater;

import android.view.MenuItem;

import android.view.ViewConfiguration;

import java.lang.reflect.Field;


public class MainActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


// Force Show Overflow menu in Action bar

try {

ViewConfiguration config = ViewConfiguration.get(this);

Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");

if(menuKeyField != null) {

menuKeyField.setAccessible(true);

menuKeyField.setBoolean(config, false);

}

} catch (Exception ex) {

}


}

} 



반응형

댓글()

WebView 사용하기

프로그래밍/Android (Java)|2015. 1. 27. 11:03
반응형

activity_main.xml


<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:background="#e1e1e1"

    android:orientation="vertical">


    <WebView

        android:id="@+id/webview"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" />


</LinearLayout> 



MainActivity.java


package com.sysdocu.pushnotifications;


import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.webkit.WebView;

import android.webkit.WebViewClient;


public class MainActivity extends Activity {

WebView webview;


@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


webview = (WebView) findViewById(R.id.webview);


try {

webview.loadUrl("http://m.daum.net/");

} catch (Exception ex) {

ex.printStackTrace();

}


webview.getSettings().setJavaScriptEnabled(true);

webview.setWebViewClient(new WebClient());

}

}


class WebClient extends WebViewClient {

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);

return true;

}

}


* 초기 웹페이지만 어플 내에서 로딩되고, 링크 클릭시 브라우저에서 열리는 문제는

   위 빨간색 부분까지 코딩 한다면 해결됩니다.


반응형

댓글()

날짜 사용 예제

프로그래밍/Android (Java)|2015. 1. 27. 11:02
반응형

MainActivity.xml


import java.text.SimpleDateformat;

import java.util.Calendar;

import java.util.Date;


Date date = new Date();

SimpleDateFormat MONTH = new SimpleDateformat("MM");

SimpleDateFormat DAY = new SimpleDateformat("dd");

String strMONTH = MONTH.format(date);

String strDAY = DAY.format(date);

String today = strMONTH + "-" + strDAY;


today 를 출력해보면 09-24 형식으로 출력됩니다.


반응형

댓글()

[에러] ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.

프로그래밍/Android (Java)|2015. 1. 27. 11:02
반응형

ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME


ANT_HOME 이 시스템 변수에 잘 등록 되어있는데 위와 같은 메세지가 출력될 경우,

(저는 블루스크린 뜨면서 리부팅 했더니 그다음부터 ant 명령이 먹히지 않았습니다.)

아래와 같이 시스템 변수값을 수정하여 해결을 하였습니다.


[ 기존]

변수 이름 : ANT_HOME

변수 값 : C:\apache-ant-1.9.4\bin


[변경 & 추가]

변수 이름 : ANT_HOME

변수 값 : C:\apache-ant-1.9.4

변수 이름 : Path

변수 값 : (...생략...);%ANT_HOME%bin

위 내용으로 설정 후, 윈도우즈 재시작으로 적용.


반응형

'프로그래밍 > Android (Java)' 카테고리의 다른 글

WebView 사용하기  (0) 2015.01.27
날짜 사용 예제  (0) 2015.01.27
html 태그 사용하기  (0) 2015.01.27
Activity 생성시에 사용되는 Intent Flag 정리  (0) 2015.01.27
어플 중복 구동 차단하기 (Intent Flag)  (0) 2015.01.27

댓글()

html 태그 사용하기

프로그래밍/Android (Java)|2015. 1. 27. 11:02
반응형

MainActivity.java

import android.text.Html;


String aaa = "hahaha";

TextView OLD = (TextView)findViewById(R.id.history);

OLD.setText(Html.fromHtml("<font color='red'>" + aaa + "</font>")); 


R.id.history 값을 출력해보면 결과를 볼 수 있습니다.


반응형

댓글()

Activity 생성시에 사용되는 Intent Flag 정리

프로그래밍/Android (Java)|2015. 1. 27. 11:01
반응형

안드로이드 엑티비티에 대해 이해하기 위해 필요한 지식은 3가지 정도가 아닐까 생각합니다. 바로 Activity Lifecycle, Task, Intent 입니다. 모두 어느정도 이해를 하시고 계신 상태라고 생각하고 글을 적어보겠습니다.

인텐트를 이용하여 새로운 엑티비티를 띄우기 위해서는 일반적으로 다음과 같은 방법으로 새로운 엑티비티를 실행하게 됩니다.

위의 코드는 다음과 같은 순서로 실행이 됩니다.

1. 새로운 MyActivity 인스턴스가 생성됩니다.
2. 이 인스턴스가 현재 태스크 스택의 최상단에 푸시가 됩니다.
3. 엑티비티가 시작되며(onStart) 포그라운드로 가져옵니다.

하지만 위와 같은 인텐트 생성에 관련된 기본적인 실행 방법을 인텐트 플래그를 사용하여 임의로 조정할 수 있습니다.

위와 같은 방법을 통해 특정한 플래그 옵션값을 startActivity(intent)가 수행될때 같이 넘겨줄 수 있습니다. 지금부터 이러한 플래그 옵션값들을 좀더 상세기 적어보도록 하겠습니다.

FLAG_ACTIVITY_BROUGHT_TO_FRONT

이 플래그는 사용자가 설정하는것이 아닌 시스템에 의해 설정되는 값입니다. 엑티비티의 실행모드가 singleTask이고 이미 엑티비티스택에 존재하고 있는 상태라고 가정을 할 때 다시 그 엑티비티가 호출되고 재활용 되었을 경우 자동으로 설정이 됩니다.

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
사용자 삽입 이미지이 플래그를 사용하면 태스크가 리셋될때 플래그가 사용된 엑티비티부터 최상단의 엑티비티까지 모두를 삭제합니다. 리셋은 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 플래그에 의해 실행이 되는데 시스템에 의해 홈스크린에서 사용자에 의해 백그라운드에 있던 태스크가 포그라운드로 전환될때에 항상 붙게 됩니다.

위의 그림에서 볼 수 있듯이 백그라운드와 포그라운드 전환관계에서 CLEAR_WHEN_TASK_RESET 플래그가 설정된 엑티비티와 이후의 엑티비티 모두가 삭제되는것을 알 수 있습니다. 백그라운드로 넘어갔을때 유지를 안해도 될 일회성 엑티비티들은 해당 플래그를 사용하면 도움이 될것이라 봅니다.

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

이 플래그는 인텐트를 이용하여 새로운 태스크를 생성하거나 존재하고 있는 태스크를 포그라운드로 가져오는 경우가 아닌경우에는 사용하여도 아무런 효과가 없습니다. 적절한 경우라면 태스크를 리셋 합니다. 이때에 태스크의 affinity 설정에 맞추어 리셋이 일어나게 되며FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET과 같은 플래그 설정에 맞추어진 특정 처리가 일어나게 됩니다.

FLAG_ACTIVITY_CLEAR_TOP
사용자 삽입 이미지만약에 엑티비티스택에 호출하려는 엑티비티의 인스턴스가 이미 존재하고 있을 경우에 새로운 인스턴스를 생성하는 것 대신에 존재하고 있는 엑티비티를 포그라운드로 가져옵니다. 그리고 엑티비티스택의 최상단 엑티비티부터 포그라운드로 가져올 엑티비티까지의 모든 엑티비티를 삭제합니다.

예를 들면 현재 ABCDE순서로 엑티비티가 스택에 들어있다고 할때 엑티비티E에서 C를 호출하게 되면 D와 E는 스택에서 삭제되고 ABC만이 남아있게 됩니다. 여기서 AB 역시 남는다는 것을 이해하셔야 합니다.

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

엑티비티가 새로운 태스크안에서 실행될때에 일반적으로 타겟 엑티비티는 ‘최근 실행된 엑티비티’ 목록에 표시가 됩니다. (이 목록은 홈버튼을 꾹 누르고 있으면 뜹니다) 이 플래그를 사용하여 실행된 엑티비티는 최근실행된엑티비티 목록에서 나타나지 않습니다.

FLAG_ACTIVITY_FORWARD_RESULT

기본적으로 엑티비티A가 엑티비티B를 호출하였다고 할 경우 startActivity(intent) 대신에startActivityForResult(intent) 메서드를 이용하여 호출을 함으로써 엑티비티B의 결과값을 엑티비티A로 전달할 수 있습니다.

엑티비티B에서는 setResult(int resultCode)를 정의한 뒤에 종료를 하게 되며 엑티비티B를 호출하였던 엑티비티A는 콜백메서드인 onActivityResult()를 통해 결과값을 전달받게 됩니다.
사용자 삽입 이미지이제 엑티비티B가 또다른 엑티비티C를 호출하였다고 가정해 봅시다. 그리고 이렇게 호출된 엑티비티C에서 엑티비티A까지 전달할 결과값을 정의하였습니다. 이 결과값을 B에서 A로 또다른 코드를 통해서 프로그래머의 코드를 통해서 값을 전달하는 번거로움을 피하기 위해 안드로이드에서는 이 인텐트 플래그값을 제공합니다.

위에 나와있는 그림의 예를 통해 보면 엑티비티B가 엑티비티C를 호출하기위해 단순히 startActivity()를 이용하는 것을 알 수 있습니다. 그리고 지금 설명중인 플래그를 붙이도록 합니다. 이후에 엑티비티C에서는setResult()를 통해 결과값을 정의를 한후에 finish()를 통해 엑티비티를 종료하도록 합니다.

엑티비티B에서는 단순히 마찬가지로 finish()를 통해 엑티비티를 종료하시기만 하면 됩니다. 이후에startActivityForResult()를 통해 엑티비티B를 호출했던 엑티비티A는 onActivityResult() 콜백 메서드로 결과값을 받아보시면 엑티비티C에서 정의한 값을 받을 수 있다는것을 알 수 있습니다.

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

이 엑티비티 플래그는 시스템에 의하여 자동으로 설정되는 플래그입니다. 홈스크린화면에서 홈버튼을 롱클릭함으로써 뜨게 되는 “최근실행목록”을 통해 실행되었을 경우 자동으로 설정됩니다.

FLAG_ACTIVITY_MULTIPLE_TASK

이 엑티비티 플래그는 FLAG_ACTIVITY_NEW_TASK와 함께 사용하지 않으면 아무런 효과가 없는 플래그입니다. 두개의 플래그를 동시에 사용할 경우 새로운 태스크는 재활용되지 않고 무조건 새로 생성되며 피호출되는 엑티비티는 이 새로운 태스트의 최상위 엑티비티가 됩니다. (당연히 하나밖에 없을테니-_-a)

FLAG_ACTIVITY_NEW_TASK

이 엑티비티 플래그를 사용하여 엑티비티를 호출하게 되면 새로운 태스크를 생성하여 그 태스크안에 엑티비티를 추가하게 됩니다. 단, 기존에 존재하는 태스크들중에 생성하려는 엑티비티와 동일한 affinity를 가지고 있는 태스크가 있다면 그곳으로 새 엑티비티가 들어가게됩니다.

하나의 어플리케이션안에서는 모든 엑티비티가 기본 affinity를 가지고 같은 태스크안에서 동작하는것이 기본적(물론 변경이 가능합니다)이지만 FLAG_ACTIVITY_MULTIPLE_TASK 플래그와 함께 사용하지 않을경우 무조건적으로 태스크가 새로 생성되는것은 아님을 주의하셔야 합니다.

FLAG_ACTIVITY_NO_ANIMATION

안드로이드 OS가 2.0으로 올라오면서 새로 추가된 엑티비티 플래그입니다. 이 플래그를 사용할 경우 엑티비티가 스크린에 등장할시에 사용될 수 있는 다양한 애니메이션 효과를 사용하지 않습니다.

FLAG_ACTIVITY_NO_HISTORY

이 플래그를 사용할 경우 새로 생성되는 엑티비티는 어떤 태스크에도 보존되지 않게 됩니다. 예를 들면 로딩화면과 같이 다시 돌아오는것이 의미가 없는 화면이라면 이 플래그를 사용하여 태스크에 남기지 않고 자동적으로 화면이 넘어감과 동시에 제거할 수 있습니다.

FLAG_ACTIVITY_NO_USER_ACTION

이 플래그가 설정되면 자동적으로 엑티비티가 호출될 경우에 자동 호출되는 onUserLeaveHint()가 실행되는것을 차단합니다. onUserLeaveHint() 콜백 메서드는 어플리케이션 사용중에 전화가 온다거나 하는등의 사용자의 액션없이 엑티비티가 실행/전환되는 경우에 호출되는 메서드입니다.

FLAG_ACTIVITY_REORDER_TO_FRONT
사용자 삽입 이미지호출하려던 엑티비티가 이미 엑티비티 스택에 존재하고 있다면 이 플래그를 사용하여 스택에 존재하는 엑티비티를 최상위로 끌어올려줍니다. 결과적으로 엑티비티 스택의 순서가 재정렬되는 효과를 가집니다. 위의 예를 볼 경우에 엑티비티E가 C를 호출하게 됨으로써 엑티비티C가 최상단으로 이동하는 결과를 확인하실 수 있습니다.

FLAG_ACTIVITY_SINGLE_TOP

이 플래그는 말그대로 하나의 탑(?)을 의미하는 설정입니다. 엑티비티를 호출할 경우 호출된 엑티비티가 현재 태스크의 최상단에 존재하고 있었다면 새로운 인스턴스를 생성하지 않습니다. 예를 들어 ABC가 엑티비티 스택에 존재하는 상태에서 C를 호출하였다면 여전히 ABC가 존재하게 됩니다.


[출처] 아이군의 블로그 (theeye.pe.kr/archives/1298)


반응형

댓글()

어플 중복 구동 차단하기 (Intent Flag)

프로그래밍/Android (Java)|2015. 1. 27. 11:01
반응형

방법1.

AndroidManifest.xml 파일의 Activity 부분에 옵션을 주어 설정할 수 있습니다.


<activity

    android:name=".SysdocuActivity"

    android:configChanges="orientation|keyboardHidden"

    android:noHistory="true"

    android:label="@string/app_name">

</activity>


* 설명

어플 (해당 Activity) 를 일부러 종료하지 않더라도 스마트폰의 Home버튼을 눌러 화면에서 벗어나면

finish() 메소드가 자동 호출되 스택에서 제거됩니다.


* 주의

설정 SettingActivity 등 다른 화면 이동한 후, back 버튼으로 SysdocuActivity 로 다시 돌아올 경우,

SysdocuActivity 는 이미 종료되어진 상태이므로 어플이 종료됩니다.

이를 감안하여 코딩해야합니다.



방법2.

이전 Activity 파일에서 다음 Activity 를 불러오는 부분에서 설정할 수 있습니다.


예) RegisterActivity.java  ->  SysdocuActivity.java  넘어갈때  SysdocuActivity.java 가 중복되지 않도록 설정


RegisterActivity.java 파일에서..

Intent in=new Intent(RegisterActivity.this, SysdocuActivity.class);

in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(in);

finish();


반응형

댓글()

[Android/Java] String 클래스의 유용한 메소드(함수)들

프로그래밍/Android (Java)|2015. 1. 27. 11:00
반응형

String클래스에는 다양한 메소드들이 존재하지만 그 중에 유용하게 많이 사용되는 것들을 모아보았다. 


1. 문자열 자르기(추출하기) - substring


String substring(int start) : start부터 끝까지 

String substring(int start, int end) : start부터 end까지


String string = "abcdefgh";

String sub1 = string.substring(5);

String sub2 = string.substring(1,4);


결과는 !!

sub1 = "efgh"

sub2 = "bcd"


substring(int start , int end)에서 중요한 점은 매개변수로 사용되는 문자열에서 각 문자의 위치를 뜻하는 index가 0부터 시작한다는 것과 start부터 end의 범위 중 end위치에 있는 문자는 결과에 포함되지 않는다는 것이다. 따라서 예제의 string.substring(1, 4)에서는 1, 2, 3위치인 b, c, d가 추출된다.



2. 문자열 나누기 - split


String[] split(String divider)

문자열을 지정된 분리자(divider)로 나누어 문자열 배열에 담아 반환 한다.


String numbers = "123/45678/90";

String[] arr = animals.split("/");


결과는 !!

arr[0] = "123"

arr[1] = "45678"

arr[2] = "90"


 

3. 문자열에 포함된 문자 검사 - contains


boolean contains(charSequence s)

지정된 문자열(s)이 포함되었는지 검사 한다.


String string = "abcdefgh";

boolean b = string.contains("efg");


결과는 !!

b = true



4. 문자열 시작 또는 끝 부분 검사 - startWith, endsWith


boolean startWith(String s) : 지정된 문자열(s)로 시작하는지 검사 한다.

boolean endsWith(String s) : 지정된 문자열(s)로 끝나는지 검사 한다.


String string1 = "http://www.google.com";

boolean b1 = string.endsWith("http");

String string2 = "Hello programming";

boolean b2 = string.endsWith("ing");


결과는 !!

b1 = true

b2 = true  



5. 문자열 일치 여부 검사 - equals


boolean equals(Object obj)

매개변수로 받은 문자열(obj)과 String인스턴스의 문자열을 비교해서 똑같은가를 판단한다. 똑같다면 true를 반환하고, obj가 String이 아니거나 문자열이 다르면 false를 반환한다. String 클래스는 equals 메소드를 오버라이드 해서 사용한다.


String string = "Android";

boolean b1 = s.equals("Android");

boolean b2 = s.equals("android");


결과는 !!

b1 = true

b2 = false



6.문자열 바꾸기(치환) - replace


String replace(CharSequence old, CharSequence new)

문자열 중의 문자열(old)을 새로운 문자열(new)로 모두 바꾼 문자열을 반환 한다.


String string = "abcdefgh";

String string2 = s.replace("cd","ZZ"));


결과는 !!

string2 = "abZZefgh"


바꿀 문자열이 많은 경우에는 replaceAll(Charsequence old, CharSequence new)를 사용한다.



7. 문자열의 문자열 길이 구하기 - length


int length()

문자열의 길이를 반환한다.


String string1 = "android";

String string2 = "초보코딩왕";

int length1 = string1.length();

int length2 = string2.length();


결과는 !!

length1 = 7;

length2 = 5;




8. 문자열의 대문자를 소문자로 바꾸기 - toLowerCase


String toLoweCase()

String 인스턴스에 저장되어있는 모든 문자열을 소문자로 변환하여 반환 한다.


String string = "Hello World Java Programming";

String lower = string.toLowerCase();


결과는 !!

lower = "hello world java programming"



9. 소문자를 대문자로 바꾸기 - toUpperCase


String toUpperCase()

String 인스턴스에 저장되어있는 모든 문자열을 대문자로 변환하여 반환 한다. 


String string = "Hello World Java Programming";

String upper = string.toUpperCase();


결과는 !!

upper = "HELLO WORLD JAVA PROGRAMMING"



10. 문자열 좌우 공백 없애기 - trim


String trim()

문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤다. 문자열 중간에 있는 공백은 제거되지 않는다.


String string = "     Hello World   ";

String trim = string.trim();


결과는 !!

trim = "Hello World"



11. 다른 자료형의 변수를 문자열로 변환하기 - valueOf


String valueOf(boolean b)

String valueOf(char c) 

String valueOf(int i) 

String valueOf(long l) 

String valueOf(float  f) 

String valueOf(double d) 

String valueOf(Object o) 

지정된 값을 문자열로 변환하여 반환 한다.

참조변수의 경우, toString()을 호출한 결과를 반환 한다.


String b = String.valueOf(true);   ->   boolean 형

String c = String.valueOf('a');    ->   char 형

String i = String.valueOf(100);    ->   int 형

String l = String.valueOf(100L);    ->   long 형

String f = String.valueOf(10f);    ->   float 형

String d = String.valueOf(10.0);   ->   double 


java.util.Date dd = new java.util.Date(); 

String date = String.valueOf(dd);   ->   date 형


결과는 !!

b = "true"

c = "a"

i = "100"

l = "100"

f = "10.0"

d = "10.0"

date = "Sub Oct 27:20:21:21 KST 2013"


[출처] 초보코딩왕의 Power Dev. (ccdev.tistory.com/11)

반응형

댓글()