티스토리 뷰

이 글은 2016-10-17 이후 수정될 예정입니다.



맨 처음 어플을 만들게 되면서 가장 먼저 생각한 것은 바로 [탭, Tabs]이었습니다.

무엇보다도 양옆으로 스크롤 하면서 사용할 수 있는 Fixed Tab + Scroll이 가장 마음에 들었는데요!


제가 네이버를 찾아보며 가장 설명이 잘되어 있는 곳은 http://blog.naver.com/liar1938/30171663892 이라 생각됩니다.

그러나 모든 것은 직접 써봐야 더 능통해 지므로 서평이 끝난 지금, 지금부터 어플 강좌를 하나씩 시작하겠습니다.


이 강좌를 통해 알수 있는것들

Fragment

Fixed Tabs + Scroll

Fragment에서 id값 찾기



먼저 프로젝트를 만들어 주세요.



Min API 11이상부터 Fixed Tabs + Swipe라는 네비게이션 타입을 지원하는 것으로 알고 있습니다.

적절하게 잡아주시고,



이렇게 Navigation Type를 "Fixed Tabs + Swipe"로 결정해 주세요. ㅎㅎ



프로젝트 생성이 끝났다면, 이제 MainActivity에 들어가 봅시다.

src/(패키지 네임)/MainActivity.java파일입니다.



제 경험상,

res/layout/activity_main.xml

res/layout/fragment_main_dummy.xml

이 두개의 파일은 건들일 필요가 없더군요.


기본적으로 아래와 같은 내용이 있을겁니다. MainActivity을 눌러 펼쳐주세요.




이 소스가 이 예제 어플에서 가장 중요한 소스입니다.

먼저, 처음 빨간색으로 칠해져 있는 메소드 public Fragment getItem(int position)의 경우 아래와 같이 변경이 필요합니다.


@Override

public Fragment getItem(int position) {

// getItem is called to instantiate the fragment for the given page.

// Return a DummySectionFragment (defined as a static inner class

// below) with the page number as its lone argument.

switch(position) {

case 0:

return new 첫번째탭에들어갈내용이담긴액티비티이름(mContext);

case 1:

return new 두번째탭에들어갈내용이담긴액티비티이름(mContext);

case 2:

return new 세번째탭에들어갈내용이담긴액티비티이름(mContext);

}

return null;

}


그런대 여기서도 수정이 필요한데요, "첫번째탭에들어갈내용이담긴액티비티이름"... 길긴하지만 일단 가봅시다.

이 부분도 수정이 필요합니다.

그런대 지금은 필요가 없으니 일단 넘어가겠습니다.


분홍색으로 칠해진 것은 추가가 필요합니다. ㅎㅎ


그다음 초록색으로 칠해져 있는 return 3; 은 탭의 갯수를 반환합니다.

이미 눈치채신 분들은 아시겠지만 탭의 갯수를 줄이려면 이 값을 줄인 다음 switch-case문도 줄여주면 되겠지요??


DummySectionFragment로 탭을 구현할 수도 있지만, onCreateView() 메소드는 inflater 객체를 사용하여 뷰를

반환하여 화면에 뿌려주므로, getItem() 메소드로 탭 화면을 지정할 때에 비해 코드가 길어지므로 지워버립니다.


마지막 파란색 부분은 탭의 이름입니다.

return getString(R.string.title_section1).toUpperCase(l);

굵고 밑줄친 부분이 탭의 이름이 되는대요 이부분은 어떻게 이루어져 있냐,

R(R.java파일을 참조합니다).string(R파일중 string부분을 참조합니다, 즉 values/string.xml을 참조합니다)

.title_section1(title_section1이란 이름의 값을 반환합니다)

이렇게 생각하시면됩니다. 저도 이렇게 생각했고요.


(이글이 올려지는 당시가 강좌가 하나도 올라와 있지 않지만, 시간이 지나 강좌를 많이 쓴 다음 차례가 되면 순서를 바꿀텐데

그때쯤이면 더 쉽게 이해가 되실겁니다. 지금은 이해하지 않아도 됩니다.)


그럼 탭의 이름을 수정하기 위해서는 values/string.xml을 수정해야겠죠?

이 부분은 너무 쉬우니 따로 말씀드리지는 않겠습니다.


밑줄이 그어 있는 onCreateOptionsMenu 메소드는 메뉴키를 누르면 뜨는 내용을 정의하는겁니다. 필요없으니 삭제합니다.



이제 MainActivity는 끝났습니다.

이어서 각 탭에 들어갈 내용물들을 만들어 봅시다.


만들고 있던 프로젝트에 마우스 오른쪽을 누른다음 New-other-Android Activity를 눌러주세요.

아무렇게나 BlankActivity를 만들어 주신다음 소스를 확인해 봅시다.


package com.tistory.whdghks913.exampletabs;


import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;


public class Tabs1 extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_tabs1);

}


@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.tabs1, menu);

return true;

}


}



너무 간단합니다. ㅎㅎ...;

각 탭에 나타날 화면과 관련된 모든 자바 소스를 이곳에 기록해야 합니다.

자 아래와 같이 그냥 수정해 주세요.


package com.tistory.whdghks913.exampletabs;


import android.annotation.SuppressLint;

import android.content.Context;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;


@SuppressLint("ValidFragment")

public class Tabs1 extends Fragment {

Context mContext;

public Tabs1(Context context) {

mContext = context;

}

@Override

public View onCreateView(LayoutInflater inflater, 

ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.activity_tabs1, null);


    return view;

}


}


위 원본 소스의 취소선은 삭제된 부분, 아래 소스의 굵은 부분은 추가, 수정된 부분입니다.

밑줄 친 부분은 다들 아시는 것처럼 레이아웃을 결정하는 xml에 관한 구문입니다.


MainActivity는 FragmentActivity를 상속하지만 탭에 들어갈 내용들은 Fragment을 상속(extends)해야 합니다.


혹시 Fragment에 대해 더 알고 싶으시다면 

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/support/v4/app/FragmentActivity.html


이제 이런 소스와 같이 나머지 탭에 들어갈 내용물들도 하나 씩 구성해 주시면 됩니다.



모든 탭의 구성이 끝났다면 아까 MainActivity에서 건너뛰었던 부분으로 돌아가 이름을 지정해야하는데요.


switch(position) {

case 0:

return new 첫번째탭에들어갈내용이담긴액티비티이름(mContext);

case 1:

return new 두번째탭에들어갈내용이담긴액티비티이름(mContext);

case 2:

return new 세번째탭에들어갈내용이담긴액티비티이름(mContext);

}


위 세 개의 문구를 만드신 Activity의 이름으로 변경해 주시면 됩니다.


이제 빌드 해보시고 작동 시켜 보시면 각 탭과 연결된 xml에 기록된 내용물들이 탭 아래에 나타나는 것을 볼 수 있습니다.




자 그런데 문제가 발생했습니다.

우리가 탭을 구현하기 위해 쓴것은 Fragment, 그런대 Fragment에서는 findViewById가 잘 작동하지 않습니다.


Button button1;

button1 = (Button) view.findViewById(R.id.button1);


이렇게 구현하시면 쉽게 작동됩니다. ㅎㅎ


위치는 View view = inflater.inflate(R.layout.activity_tab1, null);와 return view;사이에 넣어주세요.




실행 스샷




옆으로 스크롤하면 나타납니다.



메뉴 아이탬을 아래로 이동하는것은 가능합니다.

일명 루익처럼 말이죠.



이렇게 아래로 이동하는것은 가능하며, API 14 (4.0)이상에서 사용가능합니다.


<activity .. android:uiOptions="splitActionBarWhenNarrow" ..></activity>


이 빨간 문구를 AndroidManifest.xml의 <activity> 부분에 넣어주세요.



API 14보다 낮을경우, 이 구문은 무시됩니다.



예제소스

ExampleTabs.zip


댓글
  • 이전 댓글 더보기
  • chobo 안녕하세요! 안드로이드 갓 입문한 대학생입니다. ㅎㅎ

    프로젝트 개발을 들어가야하는데 메뉴를 탭 메뉴를 생각했었는데 참 많은 도움이 되었습니다.

    근데 탭 이름은 어떻게 변경하는지 알 수 있을까요?
    2013.11.16 19:29
  • Favicon of https://itmir.tistory.com Mir(whdghks913) String에서 값을 변경해 주시거나 return하는 부분을 수정해 주시면 됩니다 ㅎ
    방문 감사드립니다~
    2013.11.16 20:31 신고
  • chobo 제가 약간 혼란의 소지가 있게 말했나보네요 ㅎㅎ

    전 그 위에 탭 메뉴 있잖아요. Example Tabs 바로 밑에 뜨는 탭1, 탭2, 탭3의 이름을 어떻게 수정하나 궁금합니다 ㅎㅎ
    2013.11.16 22:27
  • Favicon of https://itmir.tistory.com Mir(whdghks913) @Override
    public CharSequence getPageTitle(int position) {
    Locale l = Locale.getDefault();
    switch (position) {
    case 0:
    return getString(R.string.title_section1).toUpperCase(l);
    case 1:
    return getString(R.string.title_section2).toUpperCase(l);
    case 2:
    return getString(R.string.title_section3).toUpperCase(l);
    }
    return null;
    }

    이부분이 탭1, 탭2, 탭3을 지정하는 메소드 입니다
    스위치를 돌려 탭이름을 반환하지요

    이 부분에 있는 R.string.(스트링이름)을 변경해 주시던가
    또는 res/values/string.xml을 연다음 각 이름을 변경해 주시면 됩니다

    R.string에 대한것은 이 강좌가 있는 게시판에 있는 강좌를 읽어보시면 알수 있습니다
    2013.11.18 15:43 신고
  • 과제싫어ㅠㅠ 안녕하세요! 탭레이아웃검색하다가 우연히 들어와서 좋은정보 얻고갑니다!
    다름이 아니라 탭을 하단부로 이동하고싶어서 여기저기찾아봣는데 딱히 도움이 되는글이 없어서
    이렇게 질문남기구갑니다ㅠ^ㅠ! 탭을 하단부로 이동하는 방법을 알고계시나요?..!
    2013.12.06 20:18
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 저도 탭을 이동하고 싶어서 자료를 찾아봐도 별다른게 없더라고요...

    한번 안드로이드 개발자 API사이트에 접속해 보심이 어떨까요?

    도움이 되지 못해 죄송합니다...
    2013.12.09 20:01 신고
  • 한큐 이렇게 만든 프로젝트에 버튼 여러 개를 추가시켜서 한 탭의 안에
    button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    }
    });

    여기에 다이얼로그를 추가하려고 하는데 자꾸 다이얼로그를 임포트시키면 오류가 생기네요. 다이얼로그를 추가하는 방법을 좀 알 수 있을까요?
    2013.12.11 22:29
  • Favicon of https://itmir.tistory.com Mir(whdghks913) findViewById를 view.findViewById로 바꿔보시고 시도해 보세요
    참고로 본문에 있습니다
    2013.12.12 17:35 신고
  • Favicon of https://marlboroyw.tistory.com ywlee 안녕하세요 주인장님^^
    잘보고 갑니다 그런데 궁금한 것이 하나있는데요.

    SetionsPagerAdapter 에서 Context mContext를 만들어서

    getItem(int position)

    함수에서

    return new 첫번째탭에들어갈내용이담긴액티비티이름(mContext);

    와 같이 리턴할때 사용하는데..
    예제를 다운받아서 코드를 보니 우선 동작은 하는데
    mContext에 뭘 집어넣는 액션은 없더라구요

    그렇다면 이게 꼭 필요한 건가요??

    + 주인장님 Menifest 파일을 보니,
    Application nodes에 Tab1, 2, 3가 android.app.Acitivity를 상속받지 않았다고 에러가 나느데..
    실행은 되네요 희안하게..ㅎㅎ
    (이건 뭐 중요한건 아니니~)

    궁금해서 질문드립니다^^
    잘봤구, 너무너무 많은 도움이 되었습니다 감사합니다.

    2014.03.06 10:50 신고
  • Favicon of https://itmir.tistory.com Mir(whdghks913) Context가 필요한 경우에 넘겨진 mContext를 사용하도록 하기 위해 사용합니다
    this룰 사용하는 부분(예를들면 토스트)에 mContext를 사용할때가 있습니다
    그리고 Tab1.java는 푸래그먼트를 상속받아서 한 탭에 들어갈 내용을 반환합니다
    2014.03.06 19:44 신고
  • Favicon of https://marlboroyw.tistory.com ywlee 답변 감사드립니다^^

    많은걸 배워가네요 ㅎㅎ

    안드로이드는 참 어려운것같아요...ㅠㅠ
    2014.03.10 10:38 신고
  • 하하 안녕하세요 주인장님^^;
    위에내용이 너무알차서 사용을 해봤는데
    첫번째 탭1에 버튼누르면 블로그가 안나오고 제가 따로만든 xml페이지가
    나오도록 하고싶은데 제가 Tab1.java부분에서 수정을 했는데.. 실행이안되네요
    public void onClick(View v) {
    Intent intent=new Intent(Tab1.this, Abc.class);
    artActivity(intent);
    }

    왜안되는지..궁금하네요.,
    2014.03.18 19:24
  • Favicon of https://itmir.tistory.com Mir(whdghks913) Tap.this대신 mContext 객체를 사용해 보세요 2014.03.18 20:33 신고
  • 하하 제가 에뮬레이터로 하는데
    버튼을 누르면 그냥 밖으로 튕기네요 ㅠ.
    2014.03.18 20:48
  • 하하 다른부분도 고쳐야하나요? 어렵네요 ㅠ 2014.03.18 22:14
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 어느부분에서 오류가 나는지, logcat을 알려주셔야 정확한 답을 드릴수 있을것 같습니다

    제 답이 늦을수 있으므로.. 관련 오류를 네이버에 동시에 검색해보시는걸 추천드립니다
    artActivity는 오타겠지요...??
    2014.03.18 22:52 신고
  • shareshot 안녕하세요~ 안드로이드 공부하는 학생입니다!!
    다름이 아니라 간단한 부분인데 잘 모르겠어서 질문드리려구요...
    지금 탭이 화면 맨위에 있잖아요~ 그 탭들을 맨 아래로 옮길 수는 없나요??!
    2014.03.23 16:23
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 스크린샷의 탭1, 탭2, 탭3을 아래로 이동하는건 찾아봤지만 없는것 같습니다

    그러나 루익처럼 메뉴를 아래로 이동하는것은 가능합니다
    본문을 수정하였으니 참고해주시면 감사드리겠습니다
    2014.03.23 17:40 신고
  • 포카리 확실한 건 아니지만,
    xml에서 바꾸면 되지 않을까요?
    2016.09.01 16:08
  • 탭 부분에서 파란색(어떤 탭이 선택되어있는지 나타내주는 부분)부분 또한 자연스럽게 슬라이딩되게 보여주고싶은데 어떤방법을 써야할까요?? 검색을 해도 잘 안나오네요ㅜㅜ 2014.04.15 11:13
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 죄송합니다 저도 잘..ㅠ 2014.04.30 14:53 신고
  • Favicon of http://favoritetisby.tistory.com 티스비 안녕하세요 frag로 탭만드는 부분 잘보고있어요!

    탭을 두 개를 만든 후, 화면에서 버튼을 누르면
    다른 액티비티로 이동해서 인텐트를 통해 값을 저장하고,
    그 값을 원래 탭 화면에 뿌리는 과정을 진행중입니다.

    뿌리는 것까지는 진행이 됐는데,
    탭1의 정보가 바뀐걸 확인하고 다른 탭을 누른후 다시 원래 탭으로 돌아가면
    값이 초기화가 되어있습니다.ㅠㅠㅠ

    혹시 탭 리스너를 새롭게 .java로 끌어내서 문제가 생기는건지, 뭐가문젠지
    잘 모르겠더라구요...
    attach 가 아니라 show를 하면 backstackrecord 에러가 나고... 골치아프네요ㅠㅠㅠ
    2014.04.28 17:39
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 혹시 저장한 값을 onCreate()에서 불러오는 코드 하셨나요? 2014.04.30 14:54 신고
  • Favicon of http://blog.naver.com/kiddk2855 구글CEO 안녕하세요 매번 좋은 포스팅 잘보고있습니다.!

    근데 보통 Activity를 새로만들면 매니페스트파일에 Activity를 등록해주는데, fragment는 따로 등록하지 않아도 문제없나요?
    2014.05.06 01:14
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 아니요 등록해 주어야 합니다

    예제 프로젝트를 다운받아서 보시면 좀더 자세한 내용을 확인하실수 있으실겁니다~
    2014.05.06 12:43 신고
  • victoryhwan 위에 대로 해서 탭메뉴 해보았는데요

    탭메뉴 컬러를 변경하고 싶은데

    어떻게 하는지 알려주실수 있나요??
    2014.06.01 14:00
  • Favicon of https://kcizzang.tistory.com 정윤문경아빠 와~ 항상 느끼는 거지만 글을 정말 이해하기 쉽게 잘쓰시는것 같습니다.
    좋은 정보 감사합니다.
    2014.06.10 10:00 신고
  • YC 언제나 많이 배워갑니다.
    궁금한 부분이 있는데 이 탭뷰에 이미지 버튼을 띄여서 누르면 다른 레이아웃이 뜨는 방식으로 디자인하고 싶은데
    도움을 주실 수 없나요? 프레그먼트를 잘 안만져봐서 힘드네요...
    2015.01.20 23:16
  • 쵸우웅 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, null);
    Button btn = (Button)view.findViewById(R.id.button);
    btn.setOnClickListener(this);
    return view;
    }

    @Override
    public void onClick(View v) {
    switch (v.getId()){
    case R.id.button:
    dialog = DialogDatePicker();
    break;
    }
    }
    private DatePickerDialog DialogDatePicker(){
    Calendar c = Calendar.getInstance();
    int cyear = c.get(Calendar.YEAR);
    int cmonth = c.get(Calendar.MONTH);
    int cday = c.get(Calendar.DAY_OF_MONTH);

    DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
    // onDateSet method
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    String date_selected = String.valueOf(monthOfYear+1)+
    " /"+String.valueOf(dayOfMonth)+" /"+String.valueOf(year);
    Toast.makeText(mContext,
    "Selected Date is ="+date_selected, Toast.LENGTH_SHORT).show();
    }
    };
    DatePickerDialog alert = new DatePickerDialog(mContext, mDateSetListener,
    cyear, cmonth, cday);
    alert.show();
    return alert;
    }

    이렇게 해서 날짜다이얼로그를 만들고 실행하는데 alert.show(); 부분에서 에러가 나네요..

    로그켓이에요

    FATAL EXCEPTION: main
    Process: com.example.user.tabsexample, PID: 3587
    android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:571)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
    at android.app.Dialog.show(Dialog.java:319)
    at com.example.user.tabsexample.Tabs1.DialogDatePicker(Tabs1.java:63)
    at com.example.user.tabsexample.Tabs1.onClick(Tabs1.java:41)
    2015.11.30 16:46
  • Favicon of https://itmir.tistory.com Mir(whdghks913) Fragment같은데 DatePickerDialog의 mContext를 getActivity()로 바꿔서 시도해보세요 2015.11.30 20:06 신고
  • 초보개발자 안녕하세요 미르님!!
    항상 잘 배워가고있습니다.
    제가 안드로이드 스튜디오에서 지금 개발중인데 ㅠ
    이클립스랑 약간 소스가 다르더라구요.ㅎㅎ
    그래서 그냥 맨화면에서 미르님 소스 보면서햇는데,
    일단, 오류안나고 실행까진 되지만,
    실행시키면 앱이종료됩니다.

    제가봤을땐 메니페스트에 제가 플라그먼트를 안넣어줘서 그런거 같은데...
    넣어도 오류납니다.ㅠㅠㅠ

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    요사이에
    <activity android:name="만든플라그먼트이름"/>
    </application>
    이렇게 다넣어줘도 안됩니다...ㅠㅠㅠ
    일단 activity를 적고 안드로이드 네임을 자동선택하면
    엑티비티목록들이 자동적으로 나오던데
    여기서는 main엑티비티만 나옵니다...ㅠㅠ
    제가추가로 만든 3개의 플라그먼트 는 안나오네요 ㅠㅠ
    어떻게 해야대나요 ㅠ
    2015.12.01 14:57
  • Favicon of https://itmir.tistory.com Mir(whdghks913) Fragment는 AndroidManifest.xml에 기록하지 않습니다.
    안드로이드 스튜디오의 로그켓화면 (아마 Android Monitor였나 있습니다)보고 오류를 확인해보세요
    모든 오류가 거기에 나와있습니다
    2015.12.01 21:03 신고
  • 포카리 mContext는 원래 null인가요? 2016.09.16 20:48
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 아뇨. Fragment를 상속받은 Tabs1.java말씀하시는거면 생성자에서 Context를 받아옵니다. 2016.09.16 20:57 신고
  • 초보개발자 switch(position) {
    case 0:
    return new Tabs1 (mContext);
    case 1:
    return new Tabs2(mContext);

    미르님 코드를 똑같이 했는데 저렇게 Tabs1&2 부분과 mContext 부분이 빨간색으로 에러처리되는데 ㅠㅠ 원인이 뭘까요!!ㅠㅠ
    2016.10.15 18:25
  • Favicon of https://itmir.tistory.com Mir(whdghks913) mContext를 넘겨줘야 하는데 mContext가 정의되지 않은 듯 합니다. 예제 프로젝트 다운받으신 다음 확인해보면 mContext를 선언하고 대입하는 부분을 보실 수 있습니다. 2016.10.15 19:35 신고
  • 초보개발자 미르님 예제파일다운받아서 복붙했거든용? 저두 mainActivity는 fragmentActivity로 상속받고 Tab1,Tab2는 fragment상속받아서 똑같이 전체 복붙했는데 제가 말한 오류뜨는 부분에 마우스놓으면 incompatible type 이란 오류가뜨네요 required:~~app.fragment found:제 패키지파일주소.Tab1 이렇게되는데 어디를 고쳐야하는건가요?ㅠㅠ 2016.10.15 22:19
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 제가 올린 프로젝트는 실행을 확인하고 올린건데.. 안드로이드 스튜디오가 업데이트 되면서 달라진게 있을까요?;
    오류를 생략하지 마시고 전체 올려주세요. 맞지 않는 타입이라는데...
    2016.10.15 22:21 신고
  • 초보개발자 흠...제가 전체파일을 보여드리고싶은데..댓글창에 그럴수가없어서 미르님 샘플소스와 설명대로 mainActivity는 FragmentActivity상속받고 Tab1,Tab2는 Fragment 상속받고 생성자함수에 mContext 똑같이 다 넣었습니다!
    return new Tabs1(mContext);

    return new Tabs2(mContext);
    정확히 이부분이 오류빨간줄그어지는 부분이구요! 오류메세지는->incompatible types.
    required:android.support.v4.app.fragment
    Found:com.example.jjhee.activitytest1015.Tab1
    요고입니다...
    2016.10.15 22:33
  • Favicon of https://itmir.tistory.com Mir(whdghks913) incompatible types가 예를들면 String을 넣어야 되는 자리에 int를 넣거나 그러면 생기는 오류거든요. (http://m.blog.naver.com/q1q3q5/10098265015)
    제가 코딩할땐 오류가 없었는데 당황스럽네요ㅎ..
    Context를 넣어줄때 정확한지 다시 한번 확인해보시고 안된다면 앱 소스를 압축해서 클라우드에 올리신후 공유 링크를 답글로 올려주세요.
    2016.10.15 22:44 신고
  • 초보개발자 네! 미르님 늦은시간까지 친절하게 답변해주셔서 정말 감사합니다! :) 궁굼한게
    Tab1,2는 fragment를 상속받는데 menifest파일에 액티비티로 등록 가능한건가요?
    메니패스트 파일에서도 자바파일인 Tab1,2등록하려하니까 오류줄이뜨네요!
    2016.10.15 23:18
  • Favicon of https://itmir.tistory.com Mir(whdghks913) AndroidManifest에 등록할 수 있는 것은 Activity, Service, Broadcast등이고, Fragment는 포함되지 않습니다~ 2016.10.15 23:24 신고
  • 초보개발자 음..근데 미르님이 올려주신 샘플소스 매니페스트파일에는
    <activity
    android:name="com.tistory.whdghks913.exampletabs.Tab1"
    android:label="@string/title_section1" >
    </activity>
    <activity
    android:name="com.tistory.whdghks913.exampletabs.Tab2"
    android:label="@string/title_section2" >
    </activity>
    <activity
    android:name="com.tistory.whdghks913.exampletabs.Tab3"
    android:label="@string/title_section3" >
    </activity>

    요렇게있더라구요!
    2016.10.15 23:32
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 어..? 죄송합니다;
    이 글을 작성할 때 제가 뭔가 착각했나봅니다...
    제가 알기로 AndroidMenifest에는 Fragment를 작성할 필요가 없다고 알고 있거든요. 딱히 오류가 되는 부분이 아니라 그 당시 이클립스 ADT에서 잡아내지 못하고 저도 발견하지 못한 것 같습니다.
    FragmentActivity도 아니고 Fragment를 AndroidManifest에 작성할 수 없을텐데 이상하네요..;
    제가 내일이나 월요일에 안드로이드 스튜디오를 업데이트 한 뒤 정확하게 StackOverflow를 뒤져본 다음 다시 이 글을 수정하거나, 새로 글을 올리겠습니다.
    블로그의 첫 글부터 수정하려 했는데, 겸사겸사 오래된 글의 오류도 전부 수정해야겠습니다.
    새로 비밀글로 메일 주소 알려주시면 글 올린 뒤에 메일로 알려드리겠습니다.
    혼동하게 해드려 죄송합니다.
    2016.10.15 23:52 신고
  • 비밀댓글입니다 2016.10.16 00:15
  • Favicon of https://itmir.tistory.com Mir(whdghks913) 블로그 정리가 생각보다 지연되어 오늘안에 글을 올리지 못할 것 같습니다.
    Fragment는 내일 시작해서 늦어도 돌아오는 일요일까지 포스팅하도록 하겠습니다.
    2016.10.18 22:50 신고
  • 김승택 감사합니다. 덕분에 탭 형식 레이아웃을 만드는 법을 잘 터득했습니다.
    레이아웃을 디자인하면서 Teb들은 밑으로 내리고 싶었는데. 찾아봐도 잘 않나와있어서
    혼자 이렇게 저렇게 하다보니다. 방법을 알았습니다.

    안드로이드 스튜디오 2.1.3 버전을 기준으로 main 액티비티의 xml 파일에서 text로 가신다음

    viewpager 와 appbar 바로 위에 vertical 형식의 리니어레이아웃을 하나 추가해주시고 뷰페이저와 앱바에 weight 1씩 주면됩니다.
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="1">

    <android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/appbar_padding_top"
    android:layout_weight="1"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="false" />

    </android.support.design.widget.AppBarLayout>
    </LinearLayout>
    2016.11.12 18:07
  • 비밀댓글입니다 2017.08.05 08:26
  • 비밀댓글입니다 2017.08.08 11:29
댓글쓰기 폼