Fragment / 메뉴와 대화상자 / Context_Menu / Toast

2022. 10. 10. 15:48Dev.Program/Android

728x90

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();

  • 우리가 알던 토스트가 아니라 커스텀한 토스트 메세지가 나옴!



728x90