- docker 설치를 위한 디렉토리를 생성 및 이동한다.

mkdir /usr/local/src/docker-installer
cd /usr/local/src/docker-installer

 

- 아래의 목록을 다운로드 한다.(http://mirror.kakao.com/centos/7.9.2009/extras/x86_64/Packages/)

wget http://mirror.kakao.com/centos/7.9.2009/extras/x86_64/Packages/container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm
wget http://mirror.kakao.com/centos/7.9.2009/extras/x86_64/Packages/fuse3-libs-3.6.1-4.el7.x86_64.rpm
wget http://mirror.kakao.com/centos/7.9.2009/extras/x86_64/Packages/fuse-overlayfs-0.7.2-6.el7_8.x86_64.rpm
wget http://mirror.kakao.com/centos/7.9.2009/extras/x86_64/Packages/slirp4netns-0.4.3-4.el7_8.x86_64.rpm

- 아래의 목록을 다운로드 한다.(https://download.docker.com/linux/centos/7/x86_64/stable/Packages/)

wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.21-3.1.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.18.1-1.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-buildx-plugin-0.10.5-1.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-24.0.1-1.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-rootless-extras-24.0.2-1.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-24.0.1-1.el7.x86_64.rpm

 

- yum local repository 설정

https://powergi.tistory.com/entry/yum-local-repository-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

yum local repository 만들기

- OS설치 CD나 USB로 특정 디렉토리에 마운트 하기#> mount /dev/sr0 /media#> cd /media/Packages #> mkdir /usr/local/src/Packages#> cp -rf /media/Packages/* /usr/local/src/Packages/

powergi.tistory.com

 

- 위에서 다운받은 패키지를 설치한다.

yum install -y container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm
yum install -y containerd.io-1.6.21-3.1.el7.x86_64.rpm
yum install -y docker-compose-plugin-2.18.1-1.el7.x86_64.rpm
yum install -y docker-buildx-plugin-0.10.5-1.el7.x86_64.rpm
yum install -y docker-ce-cli-24.0.1-1.el7.x86_64.rpm
yum install -y fuse3-libs-3.6.1-4.el7.x86_64.rpm
yum install -y fuse-overlayfs-0.7.2-6.el7_8.x86_64.rpm
yum install -y slirp4netns-0.4.3-4.el7_8.x86_64.rpm
yum install -y docker-ce-rootless-extras-24.0.2-1.el7.x86_64.rpm docker-ce-24.0.1-1.el7.x86_64.rpm

 

- docker 실행 

systemctl enable docker
systemctl start docker

 

- docker 권한 설정

chmod 666 /var/run/docker.sock
usermod -aG docker ${USER}

 

- docker 저장 위치 변경

mkdir -p /test/docker/docker-root
vi /etc/docker/daemon.json
systemctl start docker
# daemon.json
{
	"data-root": "/test/docker/docker-root"
}

- OS설치 CD나 USB로 특정 디렉토리에 마운트 하기

mount /dev/sr0 /media
cd /media/Packages 
mkdir /usr/local/src/centos7/Packages
cp -rf /media/Packages/* /usr/local/src/centos7/Packages/

 

- createrepo 설치

cd /usr/local/src/centos7/Packages/
yum localinstall -y createrepo-0.9.9-28.el7.noarch

 

- Repository 위치 지정

# CentOS 7
createrepo /usr/local/src/centos7
# Rocky Linux 8.1
createrepo /usr/local/src/centos7

- Repository 설정

# CentOS 7
cd /etc/yum.repo.d
rm -rf CentOS*
vi local-CentOS7.repo
#CentOS 7
[Centos7-local-repo]
name=CentOS7 Local Repository
baseurl=file:///usr/local/src/centos7
gpgcheck=0
enabled=1
# Rocky Linux 8.1
# local-Rocky-BaseOS.repo
[Rocky8-local-baseos]
name=Rocky8 Local Repository - BaseOS
baseurl=file:///usr/local/src/rocky8/BaseOS
gpgcheck=0
enabled=1


# local-Rocky-AppStream.repo
[Rocky8-local-appstream]
name=Rocky8 Local Repository - AppStream
baseurl=file:///usr/local/src/rocky8/AppStream
gpgcheck=0
enabled=1

- yum 동작 확인

# CentOS 7 - yum
yum clean all
yum repolist
# Rocky Linux 8.1 - dnf
dnf clean all
dnf repo list
dnf makecache

0. Android Studio 설치

다운로드 사이트 : developer.android.com/studio

 

Download Android Studio and SDK tools  |  Android 스튜디오

developer.android.com

1. Flutter 사이트에서 최신 SDK 다운받기

flutter-ko.dev/docs/development/tools/sdk/archive

 

Flutter SDK releases

All current Flutter SDK releases, both stable and developer.

flutter-ko.dev

2. 다운받은 파일을 원하는 곳에 압축해제(예: C:\src\flutter)

 

3. 압축푼 디렉토리의 경로를 환경변수 PATH에 추가

 

4. Flutter 환경 체크한 뒤 [!]가 있는지 체크(!가 있으면 해결해야함)

flutter doctor -v

 

5. Dart와 Flutter 설치

 

6. New Flutter Project... 실행

Flutter SDK path 설정:Flutter SDK 압축 푼 위치 설정
Project Name 입력 후 Finish

 

 참조 : developer.android.com/guide/navigation/navigation-getting-started

 

탐색 구성요소 시작하기  |  Android 개발자  |  Android Developers

이 주제는 탐색 구성요소를 설정하고 사용하는 방법을 설명합니다. 탐색 구성요소의 대략적인 개요는 탐색 개요를 참고하세요. 환경 설정 참고: 탐색 구성요소는 Android 스튜디오 3.3 이상이 필요

developer.android.com

1. 네비게이션 관련 Gradle 추가

 

- build.gradle에 추가

1
2
3
4
5
6
dependencies {    
    // 네비게이션 프래그먼트 추가
    def nav_version = "2.3.3"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
cs

 

- Safe Args 를 위해 build.gradle에 추가

1
2
3
4
dependencies {
    def nav_version = "2.3.4"
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}
cs
1
id 'androidx.navigation.safeargs.kotlin'
cs

 

- view binding 추가

1
2
3
viewBinding {
    enabled = true
}
cs

 

 

 

2. Bottom Navigation 에 들어갈 menu 추가

 

- 메뉴파일 추가하기

res > 마우스 우측버튼 클릭 > New > Adnroid Resource File
Resource type:Menu / File Name 입력 > OK 버튼 클릭

- bottom_nav_menu.xml 에 item 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/restaurantFragment"
        android:title="식당"
        />
    <item
        android:id="@+id/shuttleBusFragment"
        android:title="셔틀"
        />
    <item
        android:id="@+id/dustFragment"
        android:title="미세먼지"
        />
</menu>
cs

 

- item의 title대신 이미지 넣기

res > 마우스 우측버튼 클릭 > New > Vector Asset 
Clip Art 의 버튼을 클릭하여 원하는 아이콘 선택 / 이름 입력

- 선택한 아이콘을 item에 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/restaurantFragment"
        android:title="식당"
        android:icon="@drawable/ic_baseline_restaurant_24"
        />
    <item
        android:id="@+id/shuttleBusFragment"
        android:title="셔틀"
        android:icon="@drawable/ic_baseline_directions_bus_24"
        />
    <item
        android:id="@+id/dustFragment"
        android:title="미세먼지"
        android:icon="@drawable/ic_baseline_filter_drama_24"
        />
</menu>
cs

 

 

3. Fragment 생성

  1) Fragment Layout 생성

 

layout 마우스 우측버튼 클릭 > Layout Resource File
fragment 생성

  2) Layout 위젯 만들기

- tools:context는 context로 연결할 class를 설정

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:gravity="center"
    tools:context="com.example.navigationtutorial02.fragment.Restaurant">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/restaurant_title"
        android:textSize="40dp"
        android:text="식단"
        />
</LinearLayout>​

 

 

  3) Fragment 클래스 생성

- Fragment Package 추가

com.example.navigation_tutorial 마우스 우측버튼 클릭 > New > Package 선택

- fragment 패키지 생성

fragment 입력

- fragment class 생성

fragment package > New > Kotlin File/Class 클릭

- Fragment로 사용할 Class 생성(Restaurant / Shuttle / Dust)

Class 선택 > 생성할 클래스명 입력

 

- view binding 이용하여 class에 fragment 연결하기

class Restaurant : Fragment() {
    private var mBinding : FragmentRestaurantBinding? = null
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        var binding = FragmentRestaurantBinding.inflate(inflater, container, false)
        mBinding = binding
        return mBinding?.root
    }

    override fun onDestroyView() {
        mBinding = null
        super.onDestroyView()
    }
}

- item으로 등록한 fragment들도 같은 방식으로 생성

 

 

 

4. Navigation Graph 생성

res > 마우스 우측버튼 클릭 > New > Adnroid Resource File
file name(nav_graph.xml) 적고, navgation 선택 후 OK
graph를 만들기 위해 fragment 추가

 

- app:startDestination 에 처음 시작시 나타날 fragment 입력, android:name에 각 fragment에 맞는 class입력

<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/nav_graph"
    app:startDestination="@id/restaurantFragment">

    <fragment
        android:id="@+id/shuttleFragment"
        android:name="com.example.navigationtutorial02.fragment.ShuttleFragment"
        android:label="fragment_shuttle"
        tools:layout="@layout/fragment_shuttle" />
    <fragment
        android:id="@+id/restaurantFragment"
        android:name="com.example.navigationtutorial02.fragment.RestaurantFragment"
        android:label="fragment_restaurant"
        tools:layout="@layout/fragment_restaurant" />
    <fragment
        android:id="@+id/dustFragment"
        android:name="com.example.navigationtutorial02.fragment.DustFragment"
        android:label="fragment_dust"
        tools:layout="@layout/fragment_dust" />
</navigation>

 

5. activity_main.xml 에 BottomNavigationView / FragmentContainerView 추가

- FragmentContainerView - android:name 에 androidx.navigation.fragment.NavHostFragment 입력

- BottomNavigationView - app:menu 에 navigation 메뉴로 생성했던 nav_menu를 입력

<?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:weightSum="1"
    >

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/main_nav_host"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph"
        />
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNav"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:menu="@menu/nav_menu"
        />


</LinearLayout>

 

- MainActivity 에 navigation fragment와 controller를 연결 

class MainActivity : AppCompatActivity() {

    private lateinit var mBinding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 메인view에 infalte 바인딩
        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        // Navigation Fragment 생성
        var navigationFragment = supportFragmentManager.findFragmentById(R.id.main_nav_host) as NavHostFragment
        // Navigation Controller 생성
        var navController = navigationFragment.navController
        
        // Bottom Navigation 메뉴, Navigation Controller 추가
        NavigationUI.setupWithNavController(mBinding.bottomNav, navController)
    }
}

 

==> 컴파일 및 실행

 

github주소 : github.com/powergi-1/navigation_tutorial

- git 저장소 위치 선택

 

VCS -> Import into Version Control -> Create Git Repository...

 

 

- 프로젝트를 선택한뒤 git에 올릴 파일을 추가한다.

 

프로젝트 선택 > 마우스 우측버튼 클릭 > Git > Add

 

 

- commit

 

VCS > Git > Commit Directory...
comment를 달고 commit 클릭

 

 

 

- remote git 에 올리기

 

VCS > Git > Push...

 

 

- 등록 확인

 

github 프로젝트 

 

- Android Studio에 github 정보 저장

(File > Settings > Version Control > GitHub > Add count > github 계정입력)

 

 

 

- 오류가 발생하면 "use token"으로 등록

 

 

 

- github에 로그인하여 설정으로 이동(로그인 > Settings)

 

 

 

- Developer settings 선택

 

 

 

- Personal access tokens > Generate new token 선택

 

 

 

- repo, admin:org, gist 선택 후 Generate token 클릭

 

 

 

- 생성된 토큰을 Android Studio 의 토큰 입력하는곳에 입력하여 github 등록

 

 

 

- 등록 확인

 

 

 

- remote git등록

 

VCS > Git > Remotes...

 

 

- remote git 저장소 정보 입력

VCS > Git > Remotes... > Name / URL 입력 > OK 클릭

 

- 등록된 저장소 확인

 

VCS > Git > Remotes...

 

- res 폴더에 새로운 폴더(anim) 생성

slide_in_left.xml / slide_out_right.xml / slide_in_right.xml / slide_out_left.xml

( * X를 Y로 바꿔주면 위아래로 슬라이드가 적용된다. )

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="250"
    android:fromXDelta="100%"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:toXDelta="0%" />
cs
slide_in_left.xml
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="250"
    android:fromXDelta="-100%"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:toXDelta="0%" />
cs
slide_in_right.xml
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="250"
    android:fromXDelta="0%"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:toXDelta="-100%" />
cs
slide_out_left.xml
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="250"
    android:fromXDelta="0%"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:toXDelta="100%" />
cs
slide_out_right.xml

 

- Main Activity에서 slide 사용

overridePendingTransition( 새로 들어올 Activity, 기존 Activity)

1
2
3
4
5
val messageIntent = Intent(this, MessageActivity::class.java)
startActivity(messageIntent)
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right)
finish()
 
cs

- Sub Activity 에서 Slide 사용

1
2
3
4
backBtn.setOnClickListener {
            finish()
            overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_right)
}
cs

 

+ Recent posts