【AndroidStudio】 gradle 관련 에러 해결하기!

App개발/Android_Studio 2024. 9. 10. 14:49 Posted by 엑소더스팩토리
반응형

[ 에러 증상과 주요 메시지 ]

안드로이드 스튜디오를 사용하면서, 외부 프로젝트를 Import 시켰는데, 갑자기 아래와 같은 에러가 발생하면서 기존 잘 되던 프로젝트도 실행이 안 되는 일이 발생하였는데요,

android studio  Could not read workspace metadata from ...

android studio Multiple build operations failed.

android studio metadata.bin (지정된 파일을 찾을 수 없습니다)

에러 상황

짐작하기로는 Import한 프로젝트와  현재의 SDK 및 Gradle 버전과 달라서 충돌로 인한 오류가 생긴 것으로 추측을 해보는데요, 

이를 해결하기 위해, 기존 알려진 Invalidate Caches 삭제와 Reload All from Disk , Repair IDE 등등을 실행해 보았지만 해결되지 않았는데요.


결국, 이와 같은 증상의 해결방법은 아래와 같았으니, 같은 에러 증상일 경우 시도해 보세요. 

에러 메시지를 보면, " android studio metadata.bin (지정된 파일을 찾을 수 없습니다) "  부분에 있는 matadata.bin 파일에 문제가 생긴것을 알 수 있는데, 보여지는 경로로 탐색창을 열어 찾아갑니다.

그리고 문제가 된 경로의 폴더 transforms-4를 삭제 해보세요.  어차피 캐시 폴더의 내용들이니 삭제를 해도 문제는 없을 것이고 다시 작성 될 거예요.  삭제를 할 때는 모든 안드로이드 스튜디오 프로젝트를 닫아주세요.

그리고 다시 안드로이드 스튜디오를 실행시키면 아래처럼 잘 실행 되는 것을 볼 수 있습니다. 

오늘은 안드로이드 스튜디오를 사용할 때 외부 프로젝트를 Import 시켜 테스트해볼 때 겪을 수 있는 오류와 이를 해결하는 방법에 대해 다루어 보았습니다. 

감사합니다.

반응형
반응형

▶ 최신 버전의 안드로이드 스튜디오로 앱을 제작 시 둥글면서 보라색 배경의 기본 버튼이 제공됩니다. 하지만 이런 기본 제공 되는 버튼의 스타일이 썩 맘에 들지는 않는데요, 그래서 버튼의 모서리 곡률도 조절해서 사각버튼도 만들고 테두리 두께와 색상도 바꾸고 버튼의 배경 색상을 바꾸어 보는 실습을 준비했습니다.

아래 이미지가 오늘 실습의 결과물입니다.

각각을 버튼으로 만들었으니, 각각의 버튼을 클릭할 때마다 각 버튼의 컬러 코드와, 테두리(Radius) 반지름 값과, 두께를 Toast 함수를 이용해서 메시지로 표시하도록 하였습니다.

 

그럼, 코드 작성에 대해 설명드릴게요.

먼저, 안드로이드 스튜디오에서 새프로젝트를 열고,  Empty Views Activity를 선택해 주세요.

- 그래들 항목에서 build.gradle.kts (Module :app)로 들어가서 viewBinding.isEnabled = true를 추가하고 Sync Now를 적용해 주세요.

res 》 drawable 에 마우스 우클릭(RMB) 하여 New 》 Drawable Resource File로 버튼 설정에 관한 새 리소스 파일들을 만들어 줄게요.

파일 이름은 square_btn1.xml  로 할게요. 

연속해서 square_btn4.xml 까지 총 4개의 파일을 추가해 주세요. (아래 참고)

그럼, 각각의 square_btn1...  파일에 아래와 같이 코드를 입력해 주세요.

[ square_btn1 ]

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- solid로 색상 변경 -->
    <solid android:color="#FFEB3B" />
    <!-- 0dp는 모서리를 사각형으로 만듭니다 -->
    <corners android:radius="80dp" />
    <!-- 테두리 굵기와 색상 주기-->
    <stroke android:width="8dp" android:color="#85790C"/>
</shape>

 

[ square_btn2 ]

<?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- solid로 색상 변경 -->
        <solid android:color="#FF9800" />
        <!-- 0dp는 모서리를 사각형으로 만듭니다 -->
        <corners android:radius="50dp" />
        <!-- 테두리 굵기와 색상 주기-->
        <stroke android:width="5dp" android:color="#FF5722"/>
    </shape>

 

[  square_btn3 ]

<?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- solid로 색상 변경 -->
        <solid android:color="#2196F3" />
        <!-- 0dp는 모서리를 사각형으로 만듭니다 -->
        <corners android:radius="25dp" />
        <!-- 테두리 굵기와 색상 주기-->
        <stroke android:width="10dp" android:color="#3F51B5"/>
    </shape>

 

[ square_btn4 ]

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- solid로 색상 변경 -->
    <solid android:color="#aa4444" />
    <!-- 0dp는 모서리를 사각형으로 만듭니다 -->
    <corners android:radius="0dp" />
    <!-- 테두리 굵기와 색상 주기-->
    <stroke android:width="10dp" android:color="#ffaa55"/>
</shape>

 

그리고 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="5"
    android:layout_margin="10dp"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_weight="1"
        android:textStyle="bold"
        android:textColor="#FFFFFF"
        android:textSize="20dp"
        android:text="버튼 스타일 1" />
    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_weight="1"
        android:textStyle="bold"
        android:background="@drawable/square_btn1"
        android:textColor="#000000"
        android:textSize="20dp"
        android:text="버튼 스타일 2" />
    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_weight="1"
        android:textStyle="bold"
        android:background="@drawable/square_btn2"
        android:textColor="#FFFFFF"
        android:textSize="20dp"
        android:text="버튼 스타일 3" />
    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_weight="1"
        android:textStyle="bold"
        android:background="@drawable/square_btn3"
        android:textColor="#FFFFFF"
        android:textSize="20dp"
        android:text="버튼 스타일 4" />
    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/btn5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_weight="1"
        android:textStyle="bold"
        android:background="@drawable/square_btn4"
        android:textColor="#FFFFFF"
        android:textSize="20dp"
        android:text="버튼 스타일 5" />
</LinearLayout>

위처럼 코딩하면 보이는 미리 보기 모습입니다. 

버튼의 배경색뿐아니라, 둥근 형태가 기본인 버튼을 조금씩 직사각형태로 radius를 조절해 보았으며, 버튼 테두리의 두께와 색상도 변경해 보았습니다. 

그리고, MainActivity.kt 파일에는 아래처럼 코딩해 보세요.  각각의 버튼을 클릭할 때, 각 버튼의 정보를 Toast 함수를 이용해 메시지로 표시하도록 하였습니다. 

package com.example.btnstyle

import android.os.Bundle
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.btnstyle.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.btn1.setOnClickListener {
            Toast.makeText(this, "초기 설정된 기본 스타일입니다", Toast.LENGTH_SHORT).show()
        }
        binding.btn2.setOnClickListener {
            Toast.makeText(this, "-컬러:#FFEB3B \n-테두리(Radius): 80dp -두께: 8dp", Toast.LENGTH_LONG).show()
        }
        binding.btn3.setOnClickListener {
            Toast.makeText(this, "-컬러:#FF9800 \n-테두리(Radius): 50dp -두께: 5dp", Toast.LENGTH_LONG).show()
        }
        binding.btn4.setOnClickListener {
            Toast.makeText(this, "-컬러:#2196F3 \n-테두리(Radius): 25dp -두께: 10dp", Toast.LENGTH_LONG).show()
        }
        binding.btn5.setOnClickListener {
            Toast.makeText(this, "-컬러:#aa4444 \n-테두리(Radius): 0dp -두께: 10dp", Toast.LENGTH_LONG).show()
        }
    }
}

 

그럼, 실행시켜서 각각의 버튼을 클릭해 보면, 아래처럼 실행되는 것을 볼 수 있습니다.

 

그럼, 프로젝트 파일을 Export해서 올려드릴 테니, 에러나시는 분은 다운로드해서 압축을 풀고 Import 해서 확인해 보세요.( File 》 New 》 Import Project )

BtnStyle.zip
0.11MB

반응형
반응형

이번 시간에는 안드로이드 스튜디오에서 인트로 화면을 만들어 볼 텐데요, 

앱을 시작할 때 몇 초간 인트로 화면이 나오고 이후 메인화면으로 넘어가는 것을 실습해 보겠습니다. 

그럼, 안드로이드 스튜디오에서 New Project 》 Empty Views Activity를 선택해 주세요.

프로젝트가 생성되었으면, 
프로젝트 탐색창의 res 》 layout  폴더를  RMB(마우스 우 클릭)하여 New 》 Activity 》 Empty Views Activity를 추가해 주세요. (아래 참고)

타이틀 제목은 intro로 할게요.

그럼, 아래처럼 인트로 xml 파일과 코틀린 kt (자바는 js) 파일이 함께 만들어진 것을 볼 수 있습니다. (activity_intro.xml  & intro.kt )

그럼, 인트로 화면과 메인 화면을 구분하기 위해, 인트로 화면의 배경색을 기본 흰색에서 적당한 색으로 바꾸고,  intro 표시도 해볼게요.
activity_intro.xml의 코드내용을 아래와 같이 작성해 보세요.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#D1DB6E"
    tools:context=".intro">

    <TextView
        android:id="@+id/textView"
        android:layout_width="189dp"
        android:layout_height="107dp"
        android:gravity="center"
        android:singleLine="false"
        android:text="안녕하세요~!\n인트로 화면입니다.\n 5초 뒤에 사라집니다"
        android:textColor="#F44336"
        android:textSize="20dp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

그러면, 아래와 같이 보일 거예요.

그리고, 앱을 실행하면 제일 처음 뜨는 화면이 있는데, 기본적으로는 MainActivity로 지정되어 있어서, activity_main.xml 파일이 로드되어 화면에 보이게 되는데요,  우리는 지금 activity_intro.xml 파일을 먼저 띄워 주는 것으로 바꾸어야 하기 때문에, 아래 이미지를 참고해서 변경해 보세요.  app 》 manifests 》 AndroidMainfest.xml  파일을 열어서 
→ activity name이 .intro로 되어 있는 부분의  android:exported="false" 부분을 true로 변경하고 ,   
→ activity name이 .MainActivity로 되어 있는 부분의  android:exported="true" 부분을 false로 변경하면 됩니다.

그리고  .intro 부분과 .MainActivity 부분의 위치를 바꾸어 주세요.   (단, 복붙해서 바꿀 때,  />  와  > 표시가 잘못되지 않도록 주의하세요)

아래는 변경한 모습입니다. 

여기까지 해놓고 실행시켜 보면 인트로 화면이 먼저 뜨는 것을 볼 수 있습니다. 

이제, 인트로 화면이 5초 뒤에 사라지도록 해볼 텐데요,  아래처럼 intro.kt에 코드를 작성해 주세요.

class intro : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intro)

        Handler(Looper.getMainLooper()).postDelayed({
            val intent = Intent(this@intro, MainActivity::class.java)
            startActivity(intent)
            finish()
        }, 5000)
    }
}

위 코드에서 마지막에 보이는 5000 수치를 변경하면 시간을 조절할 수 있습니다. (1000 → 1초)

Handler 클래스의 postDelayed 메서드를 이용해서 MainActivity로 이동하도록 하였는데요,  만약, Handler 글자가 빨간색으로 되어 에러 표시가 난다면,  마우스를 Handler 글자 위에 올려놓은 상태에서 Alt+Enter를 눌러 해당 클래스를 import 하여 추가해 주면 됩니다. 

import android.os.Handler

그리고 실행시켜 보면 아래와 같이 화면 전환 되는 것을 볼 수 있습니다. 

 

아래에 전체 코드를 다시 한번 올려놓을 게요.

[ intro.kt ]

package com.example.intropage

import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class intro : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_intro)

        Handler(Looper.getMainLooper()).postDelayed({
            val intent = Intent(this@intro, MainActivity::class.java)
            startActivity(intent)
            finish()
        }, 5000)
    }
}

 

[ AndroidManifest.xml ]

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.IntroPage"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="false" />
        <activity
            android:name=".intro"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

[ activity_intro.xml ]

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#D1DB6E"
    tools:context=".intro">

    <TextView
        android:id="@+id/textView"
        android:layout_width="189dp"
        android:layout_height="107dp"
        android:gravity="center"
        android:singleLine="false"
        android:text="안녕하세요~!\n인트로 화면입니다.\n 5초 뒤에 사라집니다"
        android:textColor="#F44336"
        android:textSize="20dp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 감사합니다.  좋은 하루 보내세요~ 

반응형