">
톰켓을 수동으로 설치했던, 자동으로 설치했던 톰켓 폴더를 찾아 갑니다. 

그리고 톰켓 폴더 안에 lib 폴더로 갑니다. 

그리고 아래의 명령어를 실행하면 버전 확인이 가능합니다. 


java -cp catalina.jar org.apache.catalina.util.ServerInfo





'시스템 > Linux' 카테고리의 다른 글

맨티스(Mantis) 설치 방법  (0) 2017.02.01

  프로젝트를 진행하다보면 복잡하지 않더라도 협업을 해야하는 경우가 발생하죠. 

혹은 추가 개발 또는 유지 보수 업무를 맡게 되면 ERD가 없을 경우 시스템에 대해 설계/분석 하는데 시간이 더 걸리게됩니다. 

Toad for MySQL에서도 리버스 엔지니어링 기능을 가지고 DB의 스키마를 ERD로 표현해주는 기능이 있지만 수정이나 편집이 불가능 해요! 

회사 선배가 알려준 ERWin의 사용법을 이제서야 블로그에 적어봅니다.


  ERWin은 아직 Mac 버전은 없는 것 같아요. 그래서 아래 글은 Windows7(64bit) 기준으로 작성 했어요~


1. PC에 ODBC 설정에서 MySQL용 드라이버 설치 및 연결정보 설정하기!

드라이버 다운로드 Go Go!


2. 다운로드 완료 후에 '시작' 메뉴 옆의 검색 창에 '데이터 원본' 이라고 검색합니다. 


3.  ODBC 데이터 원본 32비트 또는 64비트를 선택 합니다. 그리고 추가 버튼을 클릭해 드라이버를 추가하도록 합니다. 


4. MySQL ODBC 드라이버를 선택하고 마침을 누릅니다. 


5. 항목을 입력 하고 OK 버튼을 누릅니다. 




6. ERWin을 실행 시키고, Reverse Enginnering를 실행합니다. 

설계를 추가해야할지도 모르기에 타입은 논리/물리 모델 두가지를 포함하는게 낫겠죠? 

Target Database를 MySQL로 선택하면 됩니다. 


7. Infer 영역에서 Key와 Relations를 선택하면 테이블 관계 및 키 까지 테이블이 그려질 때 같이 그려져요. 


8. User Name 및 Password를 입력하고 value에서 아까 추가한 ODBC를 선택하고 Connect를 클릭하고 조금 기다리면 테이블이 나옵니닷~


  지인의 소개로 맛있는 아이스크림 가게를 찾아왔다. 손님의 90% 이상이 아이스크림을 주문한다. '백미당'


  아주 전통 있는 아이스크림 가게 처럼 보였다. 1964년도부터 아이스크림을 만들어 온것 같은 기분이 들게 하지만

실상은 남양유업에서 런칭한 아이스크림 브렌드이다. 남양 사건을 잊어버린 사람도 있지만 기억하는 사람 중에는 

백미당이 남양유업에서 운영하는걸 알고 다시는 가지 않는 사람도 많다. 


  백미당의 페이스북 페이지에서 캡쳐한 것이다. 우유 아이스크림이니 어느정도 연관이 있는 것 같긴 하다. 

아래는 남양유업의 기업 역사.


  1964년도에 설립된 남양유업. 무언가 마케팅을 통해 역사적인 아이스크림 브렌드같이 보이게 하는것, 

그게 남양이라 조금 삐뚤하게 보였다.
아이스크림의 맛은 다른 소프트콘 보다는 조금 더 맛있긴 한것 같지만, 

저렴하게 판매하는 맥도널드나 롯데리아에서 판매하는 소프트콘과 크게 다르지 않은 것 같다. 

콘 모양이 예쁘고, 우유가 유기농? 그리고 아이스크림 양이 조금 더 많다 라는 것 외에는 가격적인 메리트는 없는 것 같다.
흑역사가 있어서 브렌드의 런칭이 성공적임에도 백미당과 남양 이라는 이름이 동시에 언급되길 꺼려하고 있다고 한다. 

이것을 인지한 소비자들 중에 다시는 백미당에서 뭐든 먹지 않겠다는 고객들이 있어서인 것 같다.

  누구나 잘못은 할 수 있다. 앞으로 당당하고 훌륭한 기업으로 다시 성장하려면 뭐든 정직해야 한다. 

애매한 1964라는 숫자를 '백미당'에게 붙이지 않고 백미당의 런칭 년도를 기점으로 100년 이상의 역사를 만들어갈 

브렌드로 이어가겠다는 포부를 가지고 시작했길 바란다.
남양의 백미당은 나에게는 아직 거부감이 있다. 역사를 녹여 내는 것은 좋지만 좀 더 솔직하게 보여야 한다. 

앞으로 좋은 모습을 기대하며 글을 마친다.


T 멤버십 VIP 영화 무료 예약 하기!


  T 멤버십 고객 중 VIP 고객은 연 6회 중 한달에 한번 영화 한편이 무료!

예매는 아래를 누르시면 바로 T멤버십으로 연결 됩니다. 


T 멤버십 VIP 영화 예매 (클릭!)


이용 가능한 극장은 CGV, 롯데시네마, 메가 박스가 있어요~

멤버십 확인하시고 꼭 6회 다 보세요!!





내 맘대로 T 멤버십 


  말 그대로 VIP 회원은 T 멤버십 할인율을 내 마음대로 설정할 수 있어요. 물론 최대 할인율은 어느정도 정해져 있습니다. 

하지만 잘 가지 않는 곳의 할인율을 낮추고 자주 가는 곳을 높이면 훨씬 효과적으로 멤버십 혜택을 받을 수 있겠죠? 



'생활 > 소소한정보' 카테고리의 다른 글

맥북 한영 키 변환 방법  (0) 2018.02.07
골다공증에 좋은 홍화씨라고 아시나요?  (0) 2017.02.03
Crawler.zip



  구글 플레이스토어에 있는 앱 이름, 아이콘, 패키지 이름이 필요해서 크롤링해서 사용하려고 만들어 보았습니다. 혹시 필요하신 분은 이거 받으셔서 좀 보강한 뒤에 사용하시면 될 것 같아요. 소스는 압축해서 파일로 올려 놨습니다.  


  우선 URL 클래스와 openStream을 사용해서 지정한 주소의 소스코드를 받아오도록 합니다. 그리고 필요한 부분을 추출하기 위해서 자를 수 있는 부분을 확인 한 다음 문자열을 잘라내면 됩니다. 문자열을 자르고 합치는게 일이지 웹을 긁어오는 건 일이 아니라 생각해요. 문자열을 잘 다루지 못하는 분이면 아래 문자열 자르고 합치는 부분에 대한 설명을 보시면 도움이 될거라 생각합니다.

  

  반복되는 부분이 끝 날때 까지 while이 돌고, while문 안에서 필요한 부분을 추출합니다. 그리고 추출한 다음 다음 문장에서 필요한 것을 추출하기 위해 추출한 부분은 다시 찾지 않도록 문자열의 일부분을 잘라내고 잘라진 문자열에서 패턴으로 필요한 부분을 찾습니다. 


  소스를 돌려보는 편이 빠를거라 생각되요~ 주석도 잘 달아놨으니까 한번 보세요~


2016/09/13 - [프로그래밍/JAVA] - 문자열을 나누거나 합치거나


'프로그래밍 > JAVA' 카테고리의 다른 글

CLOSE_WAIT 해결 방법  (1) 2017.01.13
RSA 암호화 및 복호화  (0) 2016.12.26
문자열을 나누거나 합치거나  (0) 2016.09.13

  문자열로 무엇을 한다고 하면 자르고, 합치고 하는 것이 아닐까요? 웹 크롤링을 하면서 많이 사용되는 부분을 통해 문자열을 자르고 합치는 연습을 해봅시다. 


  우선 문자열을 자르기 위해 어떻게 해야 할까요? 


1. substring(int)


  String str = "good morning"  라는 문자열이 있을 때, substring을 사용하는 것을 보도록 할게요. 

  String sub = str.substring(5) 의 결과는 'moring' 가 됩니다. 




2. substring(int, int)


  동일하게 String str= "good morning"  라는 문자열이 있을 때 어떻게 되는지 보도록 할게요. 

  String sub = str.substring(3, 7) 의 결과는 'd mo' 가 됩니다. 4번째 문자 부터 7번째 문자까지 잘립니다. 



3. indexof 를 사용하여 문자열의 위치 찾기


  동일하게 String str="good morning" 라는 문자열이 있을 때 어떻게 되는지 보도록 할게요. 

  String indexof = str.indexOf("d") 의 결과는 '3'이 나옵니다. 



  substring와 indexOf를 사용하면 크롤링 시 원하는 부분을 잘라 낸 뒤 사용할 수 있습니다. 문자열을 합치는 방법은 간단하게 '+'를 사용하는 분들이 많을거라고 생각해요. 하지만 좋지 않은 방법이라고 말씀드리고 싶습니다. 문자열을 합칠 때는 StringBuilder 나 StringBuffer Class를 사용하여 합치는 것이 좋아요. 


StringBuffer strBuf = StringBuffer();

strBuf.append("I");

strBuf.append(" love");

strBuf.append(" you");


이런 형식으로 사용할 수 있습니다. 



실제 플레이스토어에서 앱 이름, 앱 아이콘, 패키지 이름을 크롤링 하는 부분을 만든게 있는데 확인해보시면 이해하는데 도움이 될것 같네요. 


2016/09/13 - [프로그래밍/JAVA] - 자바로 크롤링 구현


'프로그래밍 > JAVA' 카테고리의 다른 글

CLOSE_WAIT 해결 방법  (1) 2017.01.13
RSA 암호화 및 복호화  (0) 2016.12.26
자바로 크롤링 구현  (0) 2016.09.13



 여행을 하기에 자동차 만큼 편리한게 또 없죠. 무거운 배낭을 짊어지지 않아도 되고, 기차나 버스 시간을 확인하지 않아도 되고, 대중 교통이 없는 곳 까지 길만 있다면 내가 가고싶은 곳은 어디라도 갈 수 있죠. 

  남들이 가보지 못한 낯선 동네, 여행 책자에서 볼 수 없던 길과 풍경은 자동차 여행이 주는 특별함 이라고 생각합니다. 그럼 자동차 여행을 하기 위해 우린 무엇이 필요 할까요? 


1. 국제 면허증

  국제 면허증은 한국에서 면허증이 있는 사람이라면 경찰서나, 면허 시험장을 방문하면 됩니다. 발급과 관련된 사항은 이후에 자세히 설명하도록 할게요~


2. 한국 면허증

  국제 면허증을 발급 받고 살펴보면 꼭 면허증을 같이 지참 하라고 적혀있습니다. 또 여권도 필수적으로 같이 가지고 계셔야되요. 


  이렇게 국제 면허증을 가지고 있다면, 여행할 곳의 공항에 있는 렌터카 업체에 온라인으로 예약을 해두는 것이 좋아요. 한국과 달리 땅이 넓은 나라들이 대다수라 렌트비(기본 운행 거리) + 초과 운행 거리에 대한 비용이 발생하게 됩니다. 하지만 공항에 있는 렌터카 지점을 이용하면 거리 무제한 옵션으로 차량을 이용할 수 있어요. 

  차량을 렌트 할 때 찌그러지거나, 타이어의 공기가 필요한 만큼 잘 들어있는지 전조등 및 브레이크 등이 잘 들어오는지 확인해야 합니다. 그리고 혹시나 하는 사고를 대비해 꼭 보험을 들도록 하세요. 

  다른 나라에서 렌트할 때 보험이 여러개로 나뉘어 있었는데 차량을 도둑 맞거나, 대인 또는 대물 사고가 나거나, 유리창과 타이어에 대한 보험을 별도로 가입할 수 있었어요. 차량 보험에 관해서는 해당 렌터카 홈페이지에 들어가서 사전에 꼭 확인하세요!


  다 확인하고 차량을 빌렸다면 이젠 안전운전 및 법규 준수! 잘 하시고 즐거운 여행 하시면 됩니다.    :)


공감 한번 꾹 눌러주세요~

'여행을 떠나요 > 세계일주' 카테고리의 다른 글

세계일주를 떠나게 된 이유  (0) 2016.08.21
여행, 을 떠난다.  (0) 2016.08.16

  WWDC 2016 에서 올해 안에 ATS에 대한 발표가 있었다. 앱에서 통신을 할 때 https로 제한한다고 한다. 2016년 말부터 앱스토어에 공개하는 앱은 ATS가 필요하다고 발표 되었다. iOS 9 버전에서는 아래 그림과 같이 설정을 하면, http로 통신이 가능하다.


하지만 iOS 10에서는 NSAllowsArbitrayLoadsinWebContent가 YES인지 체크 하며 WKWebView만 http 통신을 허용하게 된다. 불특정 다수의 서버에 http 통신을 해야 하는 경우 위와 같이 설정하고, 앱 심사 때 이유를 잘 설명해야 한다. 

'프로그래밍 > iOS' 카테고리의 다른 글

둥근버튼 만들기  (0) 2018.04.24
Xcode9 svn 사용하기  (0) 2017.12.13
app icon 사이즈  (0) 2017.11.30
CoreLocation GPS 튜토리얼  (0) 2017.11.10
library not found for -lcrt1.3.1.o 에러 해결 방법  (0) 2017.08.08



  중학교 시절부터 가지고 있던 '버킷 리스트'에는 어떤 생각으로 적어 놓았는지 모르지만 '세계일주'가 포함되어 있었다. 지금의 아내를 결혼하기 10년전에 만나 연애를 하고, 결혼하면 꼭 세계일주를 가자고 약속을 했다.  그리고 우린 2014년 10월에 결혼을 하게 되었다. 내 집마련의 꿈과 차를 가지거나, 좋은 가전 제품을 포기하고 우리는 '세계'를 보기로 했다. 남들과 다른 방향과 속도로 살아보고 싶었다. 우리가 가진 신앙을 확인하고 싶었다. 즐겁게 살고 싶었다. 다른 사람들은 어떻게 살아가는지 궁금했다. 계절이 반대인 나라는 어떨까 궁금했다. 왜 사람들은 여행을 가는지 궁금했다. 어떻게 세상에 선한 영향력을 끼치며 살수 있을까 고민하고 싶었다. 우리는 여러가지 생각으로 세계일주를 떠났다. 

  주변사람들은 재취업의 걱정과, 테러의 위험, 질병 또는 여행 중 여러 상황, 앞으로의 진로 등에 대해 많은 걱정을 했다. 물론 또 다른 많은 사람들은 아주 대단한 결정이며 어떤 것과도 바꿀 수 없는 경험이 될 것이라고 우리가 내린 결정에 대해 힘을 더해줬다. 이런 결정을 하고 있는 도중 KBS에서 방송 출연 재의가 들어왔다. '직장을 그만두고 세계일주를 가려는 20, 30 부부'에 관한 찬반 토론의 한 가운데 서서 시니어들(50대 이상)의 찬성과 반대의견을 들으며 최종 결론을 내는 프로그램이었다. 

  방송 세계가 만만찮은 곳이라는 것을 깨닫는 경험이었다. 우리의 상황과 취지를 PD와 작가에게 수차례 설명했지만 방송을 이끌고 나가는 방향이 세계일주를 나서는 것에 대한 부정적인 결론을 이끌어 내려는 것 같았다. 하지만 준비가 잘 되있었던 우리는 시니어들을 설득시키고 세계일주를 떠나는 것에 대한 찬성표를 얻어냈다. 그리고 세계일주에 걱정을 많이 하시던 양가 부모님의 마음도 이 방송을 통해 적극적인 지지로 바뀌었다. 

  세계일주에 사용된 경비는 대략 4천만원 정도였다. 혼자 생활할 때를 떠올려 보면 몇 년 치 생활비와 맞먹는 돈이다. 적지 않은 돈이었지만, 가치있게 사용했다. 여러가지 이유로 세계일주를 떠나고, 그 이유들에 대한 대다수의 답을 가지고 돌아왔다.


  

'여행을 떠나요 > 세계일주' 카테고리의 다른 글

렌터카를 빌려 보자  (0) 2016.09.12
여행, 을 떠난다.  (0) 2016.08.16

AwesomeNavigation.zip


예제는 위에 있는 압축파일 받아서 확인해주세요~


  Navigation Drawer에 대해서 쉽고, 알고 싶은 것을 속 시원히 알려드릴게요. 우선 기본적인 프로젝트를 이클립스로 생성했다면 아래와 같은 소스를 확인할 수 있습니다. 

package com.nexthops.awesomeweather;

import android.app.Activity;

import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import android.widget.ArrayAdapter;
import android.widget.TextView;


public class MainActivity extends Activity
        implements NavigationDrawerFragment.NavigationDrawerCallbacks {

    /**
     * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
     */
    private NavigationDrawerFragment mNavigationDrawerFragment;

    /**
     * Used to store the last screen title. For use in {@link #restoreActionBar()}.
     */
    private CharSequence mTitle;

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

        mNavigationDrawerFragment = (NavigationDrawerFragment)
                getFragmentManager().findFragmentById(R.id.navigation_drawer);
        mTitle = getTitle();

        // Set up the drawer.
        mNavigationDrawerFragment.setUp(
                R.id.navigation_drawer,
                (DrawerLayout) findViewById(R.id.drawer_layout));
    }

    @Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
                .commit();
    }

    public void onSectionAttached(int number) {
        switch (number) {
            case 1:
                mTitle = getString(R.string.title_section1);
                break;
            case 2:
                mTitle = getString(R.string.title_section2);
                break;
            case 3:
                mTitle = getString(R.string.title_section3);
                break;
        }
    }

    public void restoreActionBar() {
        ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle(mTitle);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (!mNavigationDrawerFragment.isDrawerOpen()) {
            // Only show items in the action bar relevant to this screen
            // if the drawer is not showing. Otherwise, let the drawer
            // decide what to show in the action bar.
            getMenuInflater().inflate(R.menu.main, menu);
            restoreActionBar();
            return true;
        }
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private static final String ARG_SECTION_NUMBER = "section_number";

        /**
         * Returns a new instance of this fragment for the given section
         * number.
         */
        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            ((MainActivity) activity).onSectionAttached(
                    getArguments().getInt(ARG_SECTION_NUMBER));
        }
    }

}

  어디를 손대야 내가 원하는데로 화면 전환이 될지가 궁금해 질텐데요. Navigation Drawer 프로젝트는 살펴보면 Fragment라는 녀석이 있습니다. 그래서 우리는 Activity를 사용하지 않고 Fragment를 사용할 거에요. 


  보여주고 싶은 화면을 두 개만 만들어 보겠습니다. 우선은 액티비티를 두개 추가해 줍니다. 그리고 소스를 수정할거에요. 

package com.example.awesomenavigation;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class FirstItemFragment extends Activity {

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

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.first_item, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}



  많이 보던 소스입니다. 여기서 아래와 같이 수정 할게요. 

package com.example.awesomenavigation;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FirstItemFragment extends Fragment {

	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		
		View view = inflater.inflate(R.layout.first_item_fragment, container, false);
		
		return view;
	}
}

  Activity를 Fragment로 수정했습니다. 이렇게 더 추가할 화면을 액티비티로 생성한 다음 위와 같이 Fragment로 수정합니다. 다시 메인 액티비티로 넘어가보도록 하겠습니다. 이제 거의 다 됐어요~

package com.example.awesomenavigation;

import android.app.Activity;

import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import android.widget.ArrayAdapter;
import android.widget.TextView;


public class MainActivity extends Activity
        implements NavigationDrawerFragment.NavigationDrawerCallbacks {

    /**
     * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
     */
    private NavigationDrawerFragment mNavigationDrawerFragment;

    /**
     * Used to store the last screen title. For use in {@link #restoreActionBar()}.
     */
    private CharSequence mTitle;

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

        mNavigationDrawerFragment = (NavigationDrawerFragment)
                getFragmentManager().findFragmentById(R.id.navigation_drawer);
        mTitle = getTitle();

        // Set up the drawer.
        mNavigationDrawerFragment.setUp(
                R.id.navigation_drawer,
                (DrawerLayout) findViewById(R.id.drawer_layout));
    }

    @Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
    	Fragment fragment;
    	FragmentManager fragmentManager = getFragmentManager();
    	switch(position) {
    	case 0:
    		fragment = new FirstItemFragment();
    		break;
    		
    	case 1:
    		fragment = new SecondItemFragment();
    		break;
    	default:
    		fragment = new FirstItemFragment();
    	}
    	
    	fragmentManager.beginTransaction()
    	.replace(R.id.container, fragment)
    	.commit();
    }

    public void onSectionAttached(int number) {
        switch (number) {
            case 1:
                mTitle = getString(R.string.title_section1);
                break;
            case 2:
                mTitle = getString(R.string.title_section2);
                break;
            case 3:
                mTitle = getString(R.string.title_section3);
                break;
        }
    }

    public void restoreActionBar() {
        ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle(mTitle);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (!mNavigationDrawerFragment.isDrawerOpen()) {
            // Only show items in the action bar relevant to this screen
            // if the drawer is not showing. Otherwise, let the drawer
            // decide what to show in the action bar.
            getMenuInflater().inflate(R.menu.main, menu);
            restoreActionBar();
            return true;
        }
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private static final String ARG_SECTION_NUMBER = "section_number";

        /**
         * Returns a new instance of this fragment for the given section
         * number.
         */
        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            ((MainActivity) activity).onSectionAttached(
                    getArguments().getInt(ARG_SECTION_NUMBER));
        }
    }

}


  50번 째 줄 부터 처음 MainActivity와 변경된 부분을 확인하면 되요. Fragment를 사용하여 Activity위에서 그려지는 부분을 변경하는 거에요. Fragment에 대한 이해가 없는 분이라면 Fragment에 대한 이해부터 하시고 이것을 보시면 더 쉽게 이해할 수 있어요. 

  화면을 꾸며주고 싶은 부분은 Fragment에서 추가하면됩니다. Activity와 생명주기도 조금 다르고, 사용하는 방법도 조금 다르니 꼭 Fragment에 대해 이해하도록 해요~


「 Tip!! 

1. 안드로이드에서 제공하는 기본 Navigation Drawer 프로젝트를 생성한다. 

2. 구성하고 싶은 화면을 Activity로 생성한다. 

3. Activity 를 Fragment 로 변경한다. 

4. MainActivity에서 Fragment를 replace 한다. 그러면 원하는 화면으로 휙휙 전환된다. 

+ Recent posts