2022. 10. 10. 15:48ㆍDev.Program/Android
42p
< Fragment >
======== 0622_ch06_ActionBar_Fragment
- androidx 가 신형 **근데 신형이 무조건 좋은 건 아님(지원이 안될수도 있기 때문에)
- androidx 가져오기
- Ctrl + I 누르면 구현해야할 메서드들 나옴(Alt+Shift+Enter 눌러도 같음)
- 탭 리스너(deprecated 처리되어있지만 아직까진 많이 사용!)
- 한세트!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 액션바를 사용하기 위해 getSupportActionBar() 메서드 호출하여 ActionBar 객체 가져오기
ActionBar bar = getSupportActionBar();
// 액션바 형태를 변경하기 위해 setNavigationMode() 메서드 호출
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // 네비게이션 모드를 탭 형식으로 지정
// --------- 탭 생성 및 부착 ---------
// 탭을 생성하기 위해 ActionBar 객체의 newTab() 메서드를 호출하여 탭 생성
tabSong = bar.newTab(); // 탭을 생성하여 Tab 타입 변수에 전달
tabSong.setText("음악별"); // 탭에 표시할 텍스트
// 음악별 탭 클릭 시 동작할 TabListener 연결(TabListener) 를 상속받았으므로 this 사용 가능
tabSong.setTabListener(this);
// 생성된 탭을 액션바에 추가(부착)
bar.addTab(tabSong);
// 가수별, 앨범별 탭 생성하여 각각 액션바에 부착
tabArtist = bar.newTab(); // 탭을 생성하여 Tab 타입 변수에 전달
tabArtist.setText("가수별"); // 탭에 표시할 텍스트
// 음악별 탭 클릭 시 동작할 TabListener 연결(TabListener) 를 상속받았으므로 this 사용 가능
tabArtist.setTabListener(this);
// 생성된 탭을 액션바에 추가(부착)
bar.addTab(tabArtist);
tabAlbum = bar.newTab(); // 탭을 생성하여 Tab 타입 변수에 전달
tabAlbum.setText("앨범별"); // 탭에 표시할 텍스트
// 음악별 탭 클릭 시 동작할 TabListener 연결(TabListener) 를 상속받았으므로 this 사용 가능
tabAlbum.setTabListener(this);
// 생성된 탭을 액션바에 추가(부착)
bar.addTab(tabAlbum);
}
- Ctrl + O 오버라이딩 단축키
- 리니어레이아웃 사용에 필요한 구성 설정
- super 를 떼도 상관없지만 그냥 명시적으로 붙여주자!
package com.example.a0622_ch06_actionbar_fragment;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements ActionBar.TabListener {
// 3개의 탭을 생성하기 위한 멤버변수 선언
ActionBar.Tab tabSong, tabArtist, tabAlbum;
// 탭에 따라 각각 생성되는 화면(Fragment)을 저장할 배열 3개 생성
MyFragment[] myFragmentArr = new MyFragment[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Fragment 를 사용하여 화면을 표현하기 위해 기존 레이아웃 표시 코드 제거
// setContentView(R.layout.activity_main);
// 액션바를 사용하기 위해 getSupportActionBar() 메서드 호출하여 ActionBar 객체 가져오기
ActionBar bar = getSupportActionBar();
// 액션바 형태를 변경하기 위해 setNavigationMode() 메서드 호출
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // 네비게이션 모드를 탭 형식으로 지정
// --------- 탭 생성 및 부착 ---------
// 탭을 생성하기 위해 ActionBar 객체의 newTab() 메서드를 호출하여 탭 생성
tabSong = bar.newTab(); // 탭을 생성하여 Tab 타입 변수에 전달
tabSong.setText("음악별"); // 탭에 표시할 텍스트
// 음악별 탭 클릭 시 동작할 TabListener 연결(TabListener) 를 상속받았으므로 this 사용 가능
tabSong.setTabListener(this);
// 생성된 탭을 액션바에 추가(부착)
bar.addTab(tabSong);
// 가수별, 앨범별 탭 생성하여 각각 액션바에 부착
tabArtist = bar.newTab(); // 탭을 생성하여 Tab 타입 변수에 전달
tabArtist.setText("가수별"); // 탭에 표시할 텍스트
// 음악별 탭 클릭 시 동작할 TabListener 연결(TabListener) 를 상속받았으므로 this 사용 가능
tabArtist.setTabListener(this);
// 생성된 탭을 액션바에 추가(부착)
bar.addTab(tabArtist);
tabAlbum = bar.newTab(); // 탭을 생성하여 Tab 타입 변수에 전달
tabAlbum.setText("앨범별"); // 탭에 표시할 텍스트
// 음악별 탭 클릭 시 동작할 TabListener 연결(TabListener) 를 상속받았으므로 this 사용 가능
tabAlbum.setTabListener(this);
// 생성된 탭을 액션바에 추가(부착)
bar.addTab(tabAlbum);
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
// Toast.makeText(this, "탭 선택", Toast.LENGTH_SHORT).show();
// 탭 선택 시 Fragment 클래스를 상속받은 서브클래스를 사용하여 각기 다른 화면 표시
MyFragment myFragment = null;
// 현재 클릭된 탭의 위치(getPosition())를 배열 인덱스로 사용
if(myFragmentArr[tab.getPosition()] == null) { // Fragment 객체가 생성되지 않았을 경우
// Fragment 클래스를 상속받은 서브클래스 인스턴스 생성
myFragment = new MyFragment();
// Bundle 객체를 생성하여 "tabName"을 키로 설정, 현재탭의 텍스트를 값으로 설정하여 저장
Bundle data = new Bundle();
data.putString("tabName", tab.getText().toString());
myFragment.setArguments(data); // Fragment 객체에 값 전달
// 현재 배열 위치에 생성된 Fragment 객체 저장
myFragmentArr[tab.getPosition()] = myFragment;
} else { // Fragment 객체가 생성되어 있을 경우
// 배열에 저장되어있는 Fragment 객체를 가져오기
myFragment = myFragmentArr[tab.getPosition()];
}
// onTabSelected() 메서드 파라미터로 전달된 FragmentTransaction 객체의
// replace() 메서드를 호출하여 새로 생성된 Fragment 또는 기존 Fragment 를
// 액션바 아래 화면에 출력(교체)
// => replace(android.R.id.content, Fragment객체)
ft.replace(android.R.id.content, myFragment);
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
// Toast.makeText(this, "탭 재선택", Toast.LENGTH_SHORT).show();
}
// Fragment 클래스를 상속받는 MyFragment 클래스 정의
public static class MyFragment extends Fragment {
String tabName; // 탭의 이름을 전달받아 저장할 변수 선언
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle data = getArguments();
tabName = data.getString("tabName");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// 탭 클릭했을 때 각 탭에 해당하는 프래그먼트의 화면 구성을 위해 LinearLayout 객체 생성
// 1. LinearLayout 구성에 필요한 레이아웃 크기 설정
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
);
// 2. LinearLayout 객체 생성(Fragment 객체(부모)의 액티비티 가져오기)
LinearLayout layout = new LinearLayout(super.getActivity());
layout.setOrientation(LinearLayout.VERTICAL); // 레이아웃 위젯 배치 방향 설정
layout.setLayoutParams(params); // 레이아웃 크기 파라미터 객체 전달
// 클릭된 탭에 따라 각각 다른 색상으로 레이아웃 설정
// => 실제 앱 구현시에는 각 레이아웃에 사용할 위젯들을 구현
if(tabName == "음악별") {
layout.setBackgroundColor(Color.RED);
} else if(tabName == "가수별") {
layout.setBackgroundColor(Color.GREEN);
} else if(tabName == "앨범별") {
layout.setBackgroundColor(Color.BLUE);
}
return layout;
}
}
}
> Chapter07
< 메뉴와 대화상자 >
- 기본 구성(7p)
======== 0622_ch07_Menu
> 우리가 폴더를 직접 만들어줘야함
- res 에서 우클릭 - New - Android Resource Directory
- 자동으로 menu 폴더 기능으로 설정해줌!
> 디자인탭
- 끌어다놓으면 itemBlue 의 서브메뉴가 됨
- 이렇게 옆으로 끌어다 놓으면(점선 잘 보기) itemBlue 서브메뉴에서 빠져나옴
- ⇒
< menu1.xml >
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!--
메뉴에서 표시할 항목을 item 태그로 생성
=> 필수 속성 : title 속성(메뉴에 표시할 텍스트)
=> 클릭된 메뉴 구분을 위해 id 속성도 필요
-->
<item
android:id="@+id/itemRed"
android:title="배경색 전환(빨강)"/>
<item
android:id="@+id/itemGreen"
android:title="배경색 전환(초록)"/>
<item
android:id="@+id/itemBlue"
android:title="배경색 전환(파랑)"/>
<!--
item 태그내에 다시 menu 태그 작성 시 서브메뉴로 등록됨
해당 item 클릭했을 때 서브메뉴가 표시되도록 하는 기능
=> menu 태그 내에 item 태그를 사용하여 서브 메뉴 추가
-->
<item android:title="서브메뉴">
<menu>
<item android:id="@+id/subItemRotate" android:title="버튼회전" />
<item android:id="@+id/subItemSize" android:title="버튼확대" />
</menu>
</item>
</menu>
< MainActivity.java >
package com.example.a0622_ch07_menu;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 옵션메뉴 등록을 위해서는 onCreateOptionsMenu() 메서드 오버라이딩
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu); // 슈퍼클래스의 생성자에 메뉴 전달
// MenuInflater 타입 변수 선언 및 getMenuInflater() 메서드를 호출
MenuInflater inflater = getMenuInflater();
// menu 폴더 내의 menu1.xml 파일을 옵션메뉴와 연결하기 위해
// MenuInflater 객체의 inflate() 메서드를 호출
// => 파라미터로 메뉴 XML 파일과 옵션메뉴 객체 전달
inflater.inflate(R.menu.menu1, menu);
return true;
}
// 옵션메뉴 클릭 시 동작할 작업은 onOptionsItemSelected() 메서드 오버라이딩
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
return super.onOptionsItemSelected(item);
}
}
- 19p
< activity_main.xml >
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:id="@+id/baseLayout">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="옵션메뉴 : 우측 상단 메뉴 버튼 클릭하세요"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn"
android:text="버튼"
android:layout_gravity="center"
android:textSize="20sp"/>
</LinearLayout>
< MainActivity.java >
package com.example.a0622_ch07_menu;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
LinearLayout baseLayout;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
baseLayout = findViewById(R.id.baseLayout);
btn = findViewById(R.id.btn);
}
// 옵션메뉴 등록을 위해서는 onCreateOptionsMenu() 메서드 오버라이딩
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu); // 슈퍼클래스의 생성자에 메뉴 전달
// MenuInflater 타입 변수 선언 및 getMenuInflater() 메서드를 호출
MenuInflater inflater = getMenuInflater();
// menu 폴더 내의 menu1.xml 파일을 옵션메뉴와 연결하기 위해
// MenuInflater 객체의 inflate() 메서드를 호출
// => 파라미터로 메뉴 XML 파일과 옵션메뉴 객체 전달
inflater.inflate(R.menu.menu1, menu);
return true;
}
// 옵션메뉴 클릭 시 동작할 작업은 onOptionsItemSelected() 메서드 오버라이딩
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
// 파라미터로 전달된 MenuItem 객체의 getItemId() 메서드를 사용하여 클릭된 메뉴 판별
switch (item.getItemId()) {
case R.id.itemRed: // 배경색 전환(빨강) 클릭 시
baseLayout.setBackgroundColor(Color.RED);
return true;
case R.id.itemGreen: // 배경색 전환(초록) 클릭 시
baseLayout.setBackgroundColor(Color.GREEN);
return true;
case R.id.itemBlue: // 배경색 전환(파랑) 클릭 시
baseLayout.setBackgroundColor(Color.BLUE);
return true;
case R.id.subItemRotate: // 버튼 회전 클릭 시 Button 위젯 회전
btn.setRotation(90); // 위젯 90도 회전
return true;
case R.id.subItemSize: // 버튼 확대 클릭 시 Button 위젯 확대
btn.setScaleX(2); // 가로 크기 2배 확대
return true;
}
return super.onOptionsItemSelected(item);
}
}
> 자바 코드만을 이용하여 메뉴 생성해보기
// Menu 객체의 add() 메서드를 호출하여 생성할 메뉴 설정
// => 파라미터에 전달하는 값 중 itemId 에 해당하는 값이 클릭된 메뉴 판별하므로 필수 설정!
menu.add(0, 1, 0, "배경색 전환(빨강)");
menu.add(0, 2, 0, "배경색 전환(초록)");
menu.add(0, 3, 0, "배경색 전환(파랑)");
// 서브메뉴의 경우, Menu 객체의 addSubMenu() 메서드를 호출하여 SubMenu 객체 가져오기
// => SubMenu 객체의 add() 메서드를 사용하여 생성할 서브 메뉴 설정
SubMenu subMenu = menu.addSubMenu("서브메뉴 >>");
subMenu.add(0, 4, 0, "버튼 회전");
subMenu.add(0, 5, 0, "버튼 확대");
switch (item.getItemId()) {
case 1: // 배경색 전환(빨강) 클릭 시
baseLayout.setBackgroundColor(Color.RED);
return true;
case 2: // 배경색 전환(초록) 클릭 시
baseLayout.setBackgroundColor(Color.GREEN);
return true;
case 3: // 배경색 전환(파랑) 클릭 시
baseLayout.setBackgroundColor(Color.BLUE);
return true;
case 4: // 버튼 회전 클릭 시 Button 위젯 회전
btn.setRotation(90); // 위젯 90도 회전
return true;
case 5: // 버튼 확대 클릭 시 Button 위젯 확재
btn.setScaleX(2); // 가로 크기 2배 확대
return true;
}
< 컨텍스트 메뉴 >
- p22
======== 0622_ch07_Context_Menu
< main_activity.xml >
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/baseLayout"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="배경색 전환"
android:textSize="20sp"
android:id="@+id/btnBg"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="버튼 변경"
android:textSize="20sp"
android:id="@+id/btnButton"/>
</LinearLayout>
- menu1.xml 만들기
======== menu1.xml / menu2.xml 만들기
< menu1.xml >
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/itemRed"
android:title="배경색 전환(빨강)"/>
<item
android:id="@+id/itemGreen"
android:title="배경색 전환(초록)"/>
<item
android:id="@+id/itemBlue"
android:title="배경색 전환(파랑)"/>
</menu>
< menu2.xml >
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/ItemRotate" android:title="버튼회전" />
<item android:id="@+id/ItemSize" android:title="버튼확대" />
</menu>
< MainActivity.java >
- 두개 오버라이딩
- 클릭된 위젯 객체 정보는 View 타입 객체(v)로 전달되어짐
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// 외부 xml 파일을 연결하기 위해 MenuInflater 객체 가져오기
MenuInflater inflater = getMenuInflater();
// 서로 다른 버튼에 각각의 컨텍스트 메뉴를 연결하기 위해서 버튼 판별
// => 클릭된 위젯 객체 정보는 View 타입 객체(v)로 전달되어짐
// => 각 버튼 클릭 시 MenuInflater 객체의 inflate() 메서드를 사용하여 XML 파일 지정
if (v == btnBg) {
menu.setHeaderTitle("배경색 전환");
inflater.inflate(R.menu.menu1, menu);
} else if (v == btnButton) {
menu.setHeaderTitle("버튼 변경");
inflater.inflate(R.menu.menu2, menu);
}
}
- 롱클릭하면 이렇게 메뉴 나옴
< MainActivity.java >
package com.example.a0622_ch07_context_menu;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
LinearLayout baseLayout;
Button btnBg, btnButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
baseLayout = findViewById(R.id.baseLayout);
btnBg = findViewById(R.id.btnBg);
btnButton = findViewById(R.id.btnButton);
// 컨텍스트 메뉴를 등록할 위젯을 registerForContextMenu() 메서드를 사용하여 지정
// => 파라미터로 위젯 객체 전달
registerForContextMenu(btnBg);
registerForContextMenu(btnButton);
// 레이아웃(배경)을 롱클릭했을 때 컨텍스트 메뉴를 표시하려면 버튼과 동일하게 등록 필수
registerForContextMenu(baseLayout);
}
// 컨텍스트 메뉴 등록 및 이벤트 처리를 위한 메서드 오버라이딩
// => onCreateContextMenu(), onContextItemSelected() 메서드
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// 외부 xml 파일을 연결하기 위해 MenuInflater 객체 가져오기
MenuInflater inflater = getMenuInflater();
// 서로 다른 버튼에 각각의 컨텍스트 메뉴를 연결하기 위해서 버튼 판별
// => 클릭된 위젯 객체 정보는 View 타입 객체(v)로 전달되어짐
// => 각 버튼 클릭 시 MenuInflater 객체의 inflate() 메서드를 사용하여 XML 파일 지정
if (v == btnBg) {
// 메뉴 상단에 표시할 제목(타이틀)이 있을 경우 setHeaderTitle() 메서드를 사용하여 설정
menu.setHeaderTitle("배경색 전환");
inflater.inflate(R.menu.menu1, menu); // menu1.xml 파일 등록
} else if (v == btnButton) {
menu.setHeaderTitle("버튼 변경"); // menu2.xml 파일 등록
inflater.inflate(R.menu.menu2, menu);
} else if (v == baseLayout) {
// 레이아웃을 롱클릭했을 때 자바코드만으로 메뉴 표시
menu.add(0,1,0,"메뉴1");
menu.add(0,2,0,"메뉴2");
}
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
// 컨텍스트 메뉴 항목 클릭 시 동작은 옵션 메뉴 동작 처리와 동일함
return super.onContextItemSelected(item);
}
}
- 배경을 롱클릭했을 때도 메뉴바 나타나게 할 수 있다!
< 토스트 >
======== 0622_ch07_Toast
< activity.xml >
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:gravity="center">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnToast"
android:text="토스트 메세지 출력"
android:textSize="20sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnSnackBar"
android:text="스낵바 메세지 출력"
android:textSize="20sp"/>
</LinearLayout>
< MainActivity.java >
> 토스트는 내장객체지만 스낵바는 외장,, 자바에서는 jar 파일을 넣었지만 안드로이드는 이렇게 추가시켜줌
- Project Structure
- Library Dependency
> com.android.support:design 검색
- 추가하기
- 이제 스낵바 검색 됨!
- 토스트와 똑같이 하면 오류가 남!
- 뷰 객체 받아주면 됨!
package com.example.a0622_ch07_toast;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.material.snackbar.Snackbar;
public class MainActivity extends AppCompatActivity {
Button btnToast, btnSnackBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnToast = findViewById(R.id.btnToast);
btnSnackBar = findViewById(R.id.btnSnackBar);
btnToast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "토스트 클릭!", Toast.LENGTH_SHORT).show();
}
});
btnSnackBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// SnackBar : 토스트와 비슷한 성격의 단순 메시지 출력
// => 단, 외부 라이브러리를 추가해야 사용 가능
// => File - Project Structure 메뉴에서 Dependency 항목에서 + 버튼 누른 뒤
// com.android.support:design 항목을 검색하여 추가
Snackbar.make(v, "스낵바 출력!", Snackbar.LENGTH_SHORT).show();
}
});
}
}
- 토스트와 스낵바 차이! (둘다 잠깐 보이고 사라짐)
> 이제 토스트 커스터마이징을 해보자
- Create New 말고 이거 사용!
- .show() 는 별도로 수행한다
btnToast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(MainActivity.this, "토스트 클릭!", Toast.LENGTH_SHORT).show();
// 토스트 메세지에 대한 커스터마이징
// Toast.makeText() 메서드를 사용하여 기본 설정
Toast toastMsg = Toast.makeText(MainActivity.this,
"토스트 메세지", Toast.LENGTH_SHORT);
// => 주의! 커스터마이징을 위해 show() 메서드를 바로 호출하지 않는다! 별도로 호출 예정
// 토스트 메세지에 대한 위치 변경을 위해서 setGravity() 메서드 호출
toastMsg.setGravity(Gravity.TOP|Gravity.LEFT, 100, 100);
// 생성된 Toast 객체를 출력하려면 show() 메서드 호출 필수!
toastMsg.show();
}
});
======== res 안 layout 안에 toast.xml 파일 만들기
======== drawable 에 ic_launcher 이미지 파일 넣기
< toast.xml >
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#FF0000"
android:gravity="center">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/toastText"
android:text="텍스트 뷰 입니다"
android:textSize="20sp"/>
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/ic_launcher"/>
</LinearLayout>
// ------------ 외부 레이아웃(XML)을 사용하여 Toast 커스터마이징 -----------
// 1. Toast 객체를 생성하여 현재 액티비티(컨텍스트 객체) 전달
Toast toast = new Toast(MainActivity.this);
// 2. View 클래스의 inflate() 메서드를 호출하여
// 토스트 커스터마이징에 사용할 XML 파일 가져오기
View toastView = View.inflate(MainActivity.this, R.layout.toast, null);
// 3. View 객체의 findViewById() 메서드를 호출하여
// toast.xml 파일 내의 TextView 위젯 ID 가져오기
// => 주의! findViewById() 메서드를 바로 호출하지 않고 View객체.findViewById() 호출
TextView toastText = toastView.findViewById(R.id.toastText);
toastText.setText("커스터마이징 토스트메세지!");
// 4. Toast 객체의 setView() 메서드를 호출하여 레이아웃을 연결한 View 객체 전달
toast.setView(toastView);
// 5. Toast 메세지 표시
toast.show();
- 우리가 알던 토스트가 아니라 커스텀한 토스트 메세지가 나옴!
'Dev.Program > Android' 카테고리의 다른 글
logcat / ListView (0) | 2022.10.10 |
---|---|
여러 Activity (0) | 2022.10.10 |
ScrollView / SlidingDrawer / ViewFlipper / WebView (0) | 2022.10.10 |
TextView / ProgressBar / SeekBar / RatingBar (0) | 2022.10.10 |
Layout / Chronometer / TimePicker / DatePicker / CalendarView (0) | 2022.10.10 |