묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
Map / SwitchMap - 2 강의 오류
Map / SwitchMap - 2 강의의 1분 29초 쯤에val mapLiveData = Transformations.map(liveCount) { it+it }란 코드가 있는데요 Transformations 를 못불러오고강의자료를 그대로 복붙했는데 이런식으로 빨간줄이 납니다.import를 못해오는거 같습니다switchMap도 마찬가지로 안됩니다. Transformations 를 임포트 못받아옵니다! 찾아보니 gradle에 이부분을 임포트 받고 implementation("androidx.lifecycle:lifecycle-livedata-core:2.3.1")이런식으로 사용하니까 되더라고요. 이런식으로 하고 진행해도 되는거겠죠?class MainViewModel : ViewModel() { private var _mutableCount = MutableLiveData(0) val liveCount : LiveData<Int> get() = _mutableCount val mapLiveData = liveCount.map { it+it } val switchMapLiveData = liveCount.switchMap { changeValue(it) } fun setLiveDataValue(count : Int) { _mutableCount.value = count } fun changeValue(count : Int) : MutableLiveData<Int> { val testLiveData = MutableLiveData(count*count) return testLiveData } }
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
baseContext 동작안함
package com.nadeukcha.horse import android.app.LauncherActivity import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.nadeukcha.horse.databinding.ActivityMainBinding class RacehorseDetailsFragment : Fragment() { private val items = mutableListOf<RacehorseModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment val view = inflater.inflate(R.layout.fragment_racehorse_details, container, false) items.add( RacehorseModel( "https://www.horsepia.com/hp/pa/hh/PAHH2010/search.do#none", "https://www.horsepia.com/hp/pa/ac/photoResizer.do?file=0047386&extend=l.jpg&width=312&height=191&type=3&hrsGbCd=00100&bfHrno=047386", "기적의돌풍" ) ) // items.add items.add( RacehorseModel( "https://www.horsepia.com/hp/pa/hh/PAHH2010/search.do#none", "https://www.horsepia.com/hp/pa/ac/photoResizer.do?file=0047386&extend=l.jpg&width=312&height=191&type=3&hrsGbCd=00100&bfHrno=047386", "기적의돌풍" ) ) // items.add items.add( RacehorseModel( "https://www.horsepia.com/hp/pa/hh/PAHH2010/search.do#none", "https://www.horsepia.com/hp/pa/ac/photoResizer.do?file=0047386&extend=l.jpg&width=312&height=191&type=3&hrsGbCd=00100&bfHrno=047386", "기적의돌풍" ) ) // items.add items.add( RacehorseModel( "https://www.horsepia.com/hp/pa/hh/PAHH2010/search.do#none", "https://www.horsepia.com/hp/pa/ac/photoResizer.do?file=0047386&extend=l.jpg&width=312&height=191&type=3&hrsGbCd=00100&bfHrno=047386", "기적의돌풍" ) ) // items.add val rv = view.findViewById<RecyclerView>(R.id.racehorseRv) val rvAdapter = RvAdapter(baseContext ,items) rv.adapter = rvAdapter // rv.layoutManager = LinearLayoutManager(context) rv.layoutManager = GridLayoutManager(context, 2) // 경기 내역 확인 view.findViewById<Button>(R.id.btn1).setOnClickListener { it.findNavController().navigate(R.id.action_racehorseDetailsFragment_to_matchdetailsFragment) } // 기수 상제 정보 view.findViewById<Button>(R.id.btn3).setOnClickListener { it.findNavController().navigate(R.id.action_racehorseDetailsFragment_to_riderDetailsFragment) } // 기록 정보 view.findViewById<Button>(R.id.btn4).setOnClickListener { it.findNavController().navigate(R.id.action_racehorseDetailsFragment_to_recordInfoFragment) } return view } }안녕하세요Fragment 강의에서 봤던 동작이랑 이번에 RecyclerView 강의를 합쳐서 화면을 만들어보고있었습니다그러던중 이번 강의 망고플레이트 앱 소개 및 레이아웃 - RecyclerView, Glide 강의의 24분 14초에 baseContext 추가하는 동작하를 하려고해는데 baseContext가 인식되지 않는 현상이있는데 따로 설정해줘야하는 부분이 있는건가요? baseContext를 넣으면 이런 오류가 나옵니다강의 내역과 조금 다른 질문인거같아 죄송합니다
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
웹뷰에서 사이트로 넘어갈 때 오류가 납니다.
package com.example.mango_content import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView class MainActivity : AppCompatActivity() { //데이터 넣을 리스트 변수 생성 private val items = mutableListOf<ContentsModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 리스트 데이터 // 데이터 클래스이기 때문에 차례대로 넣을 값만 넣어주면 된다 items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/Quiver/shopPhotoList", "https://image.toast.com/aaaaaqx/rv/s4XU7ZHko4NjDEkULtFHbAA/231108173855775(0).jpeg", "퀴버(Quiver)" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/bistrogama/shopPhotoList?pickup-date=231207&pickup-time=0342", "https://image.toast.com/aaaaaqx/catchtable/shopinfo/s23522/23522_2221020170729696.jpg?detail750", "비스트로 가마" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/cucciolo_seoul/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0346", "https://ugc-images.catchtable.co.kr/rv/s7YDg2g4TxcuMPb-Eds2nKQ/4179dd6517aa48e1900c08e8c9c769a5", "쿠촐로 서울" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/schedule_seongsu/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0352", "https://ugc-images.catchtable.co.kr/rv/sXGZ4Ldt3lvBgj3V-4rxIsQ/e6ce38eef9ee412ca63da36dacabc57a", "스케줄 성수" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/Quiver/shopPhotoList", "https://image.toast.com/aaaaaqx/rv/s4XU7ZHko4NjDEkULtFHbAA/231108173855775(0).jpeg", "퀴버(Quiver)" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/bistrogama/shopPhotoList?pickup-date=231207&pickup-time=0342", "https://image.toast.com/aaaaaqx/catchtable/shopinfo/s23522/23522_2221020170729696.jpg?detail750", "비스트로 가마" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/cucciolo_seoul/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0346", "https://ugc-images.catchtable.co.kr/rv/s7YDg2g4TxcuMPb-Eds2nKQ/4179dd6517aa48e1900c08e8c9c769a5", "쿠촐로 서울" ) ) items.add( ContentsModel( "https://app.catchtable.co.kr/ct/shop/schedule_seongsu/shopPhotoList?type=VISIT_RESERVATION&pickup-date=231207&pickup-time=0352", "https://ugc-images.catchtable.co.kr/rv/sXGZ4Ldt3lvBgj3V-4rxIsQ/e6ce38eef9ee412ca63da36dacabc57a", "스케줄 성수" ) ) val recyclerview = findViewById<RecyclerView>(R.id.rv) val rvAdapter = RVAdapter(baseContext,items) recyclerview.adapter = rvAdapter // 아이템 클릭 처리 rvAdapter.itemClick = object : RVAdapter.ItemClick { override fun onClick(view: View, position: Int) { val intent = Intent(baseContext, ViewActivity::class.java) intent.putExtra("url", items[position].url ) startActivity(intent) } } recyclerview.layoutManager = GridLayoutManager(this,2) } }MainActivity.kt package com.example.mango_content import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.appcompat.view.menu.MenuView.ItemView import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.bumptech.glide.Glide //viewmodel을 받을 것임 class RVAdapter(val context: Context, val List: MutableList<ContentsModel>) : RecyclerView.Adapter<RVAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RVAdapter.ViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.rv_item, parent, false) return ViewHolder(v) } // 웹뷰 클릭 이벤트 생성 interface ItemClick { fun onClick(view : View, position: Int) } var itemClick : ItemClick? = null override fun onBindViewHolder(holder: RVAdapter.ViewHolder, position: Int) { if (itemClick != null) { holder.itemView.setOnClickListener { v -> itemClick!!.onClick(v, position) } } holder.bindItems(List[position]) } override fun getItemCount(): Int { return List.size } inner class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) { fun bindItems(item : ContentsModel) { val rv_img = itemView.findViewById<ImageView>(R.id.rvImageArea) val rv_text = itemView.findViewById<TextView>(R.id.rvTextArea) rv_text.text = item.titleText Glide.with(context) .load(item.imageUrl) .into(rv_img) } } } RVAdapter.kt package com.example.mango_content import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.webkit.WebView class ViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_view) val webView = findViewById<WebView>(R.id.webView) webView.loadUrl(intent.getStringExtra("url").toString()) } }ViewActivity.kt<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> <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.Mango_content" android:usesCleartextTraffic="true" tools:targetApi="31"> <activity android:name=".ViewActivity" android:exported="false" /> <activity android:name=".SplashActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:exported="true"></activity> </application> </manifest>manifest.xml실행 했을 시, 다음과 같은 오류가 일어납니다.망고플레이트가 서버 종료되어서 저는 캐치테이블 사이트를 이용하였습니다.오류 구글링하여 매니패스트에android:usesCleartextTraffic="true" 도 추가 하였는데 그대로 오류나서 질문 드립니다. ㅠㅠ
-
미해결[LV1] Jetpack Compose - UI 연습하기
Canvas drawCircle 에서
androidx.compose.foundation.Canvas( modifier = Modifier .fillMaxSize() ) { drawCircle( color = Color.Black, radius = size.minDimension/10, ) }늘 수고 많으신 강사님의 노고에 다시한번 감사드리며위 처럼 코딩하면 오류가 없으나 Canvas(modifier = Modifier.fillMaxSize()) { drawCircle(Color.Black, radius = size.minDimension / 10) }이렇게 하면 오류가 발생하는데 왜 그런지요 ...
-
미해결[LV1] Jetpack Compose - UI 연습하기
Canvas drawCircle 에서
수강에 어려움이 있으신가요?언제든 편하게 문의주세요! 문의주실 때 전체 코드를 깃허브나 구글 드라이브에 업로드해주시고 링크를 함께 공유해주시면빠르게 살펴볼 수 있습니다. 서로 오고가는 따뜻한 말 한마디가 있다면 저와 수강생분 모두 좋을꺼에요!
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
emailArea가 안나와요..
package com.bokchi.mysolelife.auth import android.database.DatabaseUtils import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.databinding.DataBindingUtil import com.bokchi.mysolelife.R import com.bokchi.mysolelife.databinding.ActivityIntroBinding import com.google.firebase.Firebase import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.auth class JoinActivity : AppCompatActivity() { private lateinit var binding: ActivityIntroBinding private lateinit var auth: FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) auth = Firebase.auth binding = DataBindingUtil.setContentView(this, R.layout.activity_join) binding.joinBtn.setOnClickListener { val email = binding.emailArea } // auth.createUserWithEmailAndPassword("abc@abc.com", "12341234") // .addOnCompleteListener(this) { task -> // if (task.isSuccessful) { // Toast.makeText(this, "성공", Toast.LENGTH_LONG).show() // } else { // Toast.makeText(this, "실패", Toast.LENGTH_LONG).show() // } // } } }여기 보면 선생님과 똑같이 했는데 emailArea을 이제 칠때 빨간색으로 뜨면서 안되요...<?xml version="1.0" encoding="utf-8"?> <layout> <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=".auth.JoinActivity" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:background="@color/mainColor" android:layout_height="150dp"> <TextView android:text="회원가입" android:gravity="center" android:textStyle="bold" android:textColor="@color/black" android:textSize="20sp" android:layout_width="match_parent" android:layout_height="50dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="50dp" android:orientation="vertical"> <EditText android:id="@+id/emailArea" android:layout_width="match_parent" android:layout_height="50dp" android:hint="email" style="@style/AuthEditText"/> <LinearLayout android:layout_width="match_parent" android:background="#999999" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="0.5dp"/> <EditText android:id="@+id/passwordArea" android:layout_width="match_parent" android:layout_height="50dp" android:inputType="textPassword" android:hint="password" style="@style/AuthEditText"/> <LinearLayout android:layout_width="match_parent" android:background="#999999" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="0.5dp"/> <EditText android:id="@+id/passwordArea2" android:layout_width="match_parent" android:layout_height="50dp" android:inputType="textPassword" android:hint="password check" style="@style/AuthEditText"/> <LinearLayout android:layout_width="match_parent" android:background="#999999" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="0.5dp"/> <Button android:id="@+id/joinBtn" android:layout_margin="20dp" android:background="@drawable/background_radius_yellow" android:text="회원가입하기" android:layout_width="match_parent" android:layout_height="50dp"/> </LinearLayout> </LinearLayout> </layout> 여기 ID emailArea 적어져 있습니다 그런데 왜(?) 이런 오류가 뜨는 것일가요?? 알려주세요...ㅠㅠ
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
alt + 엔터를 했는데도 안나오면 어떻게 해야될까요?
Intent를 알트 + 엔터를 쳤을 때 안나오는데 어떻게 하면 나오는지 궁금합니다.
-
해결됨[초급] 맛보자! 코틀린과 스프링으로 API 호출하기
Required request body is missing
Required request body is missing소스가 동일한데도 자꾸 위 에러가 나는데요혹시 스프링버전의 문제일까요?
-
미해결2시간으로 끝내는 코루틴
코루틴이 자바 reactive streams 대신에 쓸 수 있는 것일까요?
추후에 자바 프로젝트를 코틀린으로 컨버팅할 계획을 가지고 있는데 자바의 비동기 라이브러리인 reactive streams를 코루틴이 대체할 수 있을까 해서요
-
미해결[중급편] 친절한 JETPACK 개론 <하> (Android Kotlin)
DataStoreEx 파트 class MyDataStore(context: Context) { 수정 제안)
기존 : 지역 변수DataStoreEx 파트 class MyDataStore {... private val Context.dataStore : DataStore<Preferences> by preferencesDataStore("user_pref")...}제안 : 전역 변수로 변경private val Context.dataStore : DataStore<Preferences> by preferencesDataStore("user_pref")DataStoreEx 파트 class MyDataStore {...} 위 내용을 코딩중 Context.dataStore은 전역 변수 또는 싱글톤으로 제작 해야 안정적으로 보입니다 . 예를 들어서 Activity안에 위 클래스를 생성하는 코드를 작성한 후 동작 하면 일단은 동작 합니다.하지만 다시 Activity에 진입하면 에러가 납니다.DataStore version 1.0.0입니다. 왜 그런지 찾아 보니버전 1.0.0-alpha072021년 2월 24일androidx.datastore:datastore-*:1.0.0-alpha07이 출시되었습니다. 버전 1.0.0-alpha07에 포함된 커밋을 확인하세요.API 변경사항Context.createDataStore 확장 함수를 삭제하고 globalDataStore 속성 위임으로 대체했습니다. kotlin 파일의 최상위 수준에서 globalDataStore를 한 번 호출합니다. 예:val Context.myDataStore by dataStore(...) kotlin 파일의 최상위 수준에 배치하면 이 인스턴스가 하나만 생깁니다. (I57215, b/173726702)RxDataStore 함수는 이제 DataStore의 확장 함수 대신 RxDataStore 클래스에 있습니다. (Idccdb, b/177691248)EncryptedSharedPreferences를 DataStore로 이전(또는 SharedPreferences를 직접 부팅)하려는 경우 이제 SharedPreferences를 삽입할 수 있는 새로운 SharedPreferencesMigration 생성자를 사용하면 됩니다. (I8e04e, b/177278510)================================버그 수정동일한 파일에 활성 DataStore가 여러 개 있는 경우 이제 DataStore에서 예외가 발생합니다. DataStore를 싱글톤으로 관리하지 않았거나 한 파일의 DataStore 인스턴스 두 개가 동시에 활성화되지 않도록 조치하지 않은 경우 이제 DataStore를 읽거나 DataStore에 쓸 때 예외가 발생할 수도 있습니다. DataStore를 싱글톤으로 관리하면 해결할 수 있습니다. (Ib43f4, b/177691248)호출자 범위 취소 시의 취소 동작을 수정합니다. (I2c7b3) 라고 적혀 있네요 ... 그래서 전 Context.myDataStore를 전역 변수로 수정하고 테스트 했는데 정상적으로 동작 되는것을 확인 했습니다. 이상입니다.
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
실행하면 바로 앱이 안떠요..
이제 처음 선생님도 앱을 실행했을때 ok라고 뜨 잖아요 그런데 저는 실행도 안되요...그래서 다시 처음부터 했는데 되지 않아요.......ㅠㅠ
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
entity->dto 변환 질문입니다.
data class BookHistoryResponse( val name: String, val isReturn : Boolean ){ companion object { fun of(history: UserLoanHistory): BookHistoryResponse { return BookHistoryResponse( name = history.bookName, isReturn = history.isReturn ) } } }현재 이코드 대신 확장함수를 이용해서fun UserLoanHistory.toDto(): BookHistoryResponse{ return BookHistoryResponse( name = this.bookName, isReturn = this.isReturn ) }user.userLoanHistories.map{it.toDto()} 이와 같은 방식은 잘 사용하지 않는 방식인가요?
-
해결됨아이비의 안드로이드 드릴
아이비 선생님, 학습자료는 어디서 다운받을 수 있나요?
안녕하세요. 아이비 선생님, 수강생 류지영입니다.강의소개 페이지에서 안내해주신 학습자료는 어디서 다운받을 수 있나요? 😀 학습 자료안드로이드 프로젝트 3개 구현 코드 Figma 프로젝트 링크개념 학습을 위한 예제 코드
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
게시글/댓글 작성 후 리스트뷰에 즉시 반영이 안됩니다
안녕하세요 강사님좋은 강의 제공해주셔서 감사합니다.제목 그대로의 문제가 있어서 질문 남깁니다.BoardWrite액티비티에서 게시글 작성 후 등록 버튼을 누르고 finish()를 통해 프래그먼트로 빠져나오는 경우,그리고 BoardInside액티비티에서 댓글을 등록한 경우리스트뷰에 결과가 즉시 반영되지 않는 것 같습니다.다른 액티비티 혹은 프래그먼트로 이동 후 돌아오면 반영되긴 하지만요...강사님 영상을 보니 게시글/댓글 모두 리스트뷰에 즉시 반영되는 것 같은데...아, 차이점이 있다면 저는 binding을 쓰지 않았습니다. 혹시 이 탓일까요?
-
미해결모던 안드로이드 - Jetpack Compose 입문
val scaffoldState = rememberScaffoldState() 에서 빨간줄이 생기네요
늘 수고많으신 강사님의 노고에 감사드립니다아래 코드중 val scaffoldState = rememberScaffoldState() 에서 빨간줄이 생기네요 class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val viewModel = viewModel<MainViewModel>() HomeScreen(viewModel = viewModel) } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen(viewModel: MainViewModel) { val focusManager = LocalFocusManager.current val (inputUrl, setUrl) = rememberSaveable { mutableStateOf("https://www.google.com") } val scaffoldState = rememberScaffoldState() Scaffold ( topBar = { TopAppBar( title = { Text("나의 웹브라우져")}, actions = { IconButton(onClick = { viewModel.undo() }){ Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "back", tint = Color.Black ) } IconButton(onClick = { viewModel.redo() }){ Icon( imageVector = Icons.Default.ArrowForward, contentDescription = "forward", tint = Color.Black ) } } ) } ) { paddingValues -> Column( modifier = Modifier .padding(16.dp) .fillMaxSize() ) { OutlinedTextField( value = inputUrl, onValueChange = setUrl, label = { Text("https://")}, modifier = Modifier .padding(paddingValues) .fillMaxWidth(), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardActions = KeyboardActions(onSearch = { viewModel.url.value = inputUrl focusManager.clearFocus() }), ) Spacer(modifier = Modifier.height(16.dp)) MyWebView(viewModel = viewModel) } } } @Composable fun MyWebView(viewModel: MainViewModel) { val scope = rememberCoroutineScope() AndroidView( modifier = Modifier.fillMaxSize(), factory = { WebView(it).apply { settings.javaScriptEnabled = true webViewClient = WebViewClient() loadUrl("https://google.com") } }, update = { webView -> webView.loadUrl(viewModel.url.value) scope.launch{ viewModel.undoSharedFlow.collectLatest { if(webView.canGoBack()) { webView.goBack() } } } scope.launch{ viewModel.redoSharedFlow.collectLatest { if(webView.canGoForward()) { webView.goForward() } } } }, )
-
미해결[중급편] 코인 가격 모니터링 앱 제작 (Android Kotlin)
풀 소스 코드는 없나요!?
풀 소스 코드는 없나요!?
-
미해결모던 안드로이드 - Jetpack Compose 입문
나만의 웹브라우져 02 코드실행시 에뮬레이터에 따라
Galaxy Nexus API 34 일 경우는 정상적으로 실행되나Pixel 7 Pro APi 34 일 경우는 실행중에 에뮬레이터가 사라집니다 class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { HomeScreen() } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen() { Scaffold ( topBar = { TopAppBar( title = { Text("")}, actions = { IconButton(onClick = { }){ Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "back", tint = Color.White ) } IconButton(onClick = { }){ Icon( imageVector = Icons.Default.ArrowForward, contentDescription = "forward", tint = Color.White ) } } ) } ) { paddingValues -> Column( modifier = Modifier .padding(16.dp) .fillMaxSize() ) { OutlinedTextField( value = "", onValueChange = {}, label = { Text("https://")}, modifier = Modifier .padding(paddingValues) .fillMaxWidth(), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardActions = KeyboardActions(onSearch = {}), ) Spacer(modifier = Modifier.height(16.dp)) MyWebView() } } } @Composable fun MyWebView() { AndroidView( modifier = Modifier.fillMaxSize(), factory = { WebView(it).apply { settings.javaScriptEnabled = true webViewClient = WebViewClient() loadUrl("https://google.com") } }, update = {}, ) }
-
미해결코딩의민족 앱 제작 (Android kotlin)
View Binding으로 GridView를 구현하고 싶습니다.(섹션0-GridView 강의 문의)
안녕하세요. 섹션0의 Gridview를 실습 문의드립니다. 질문내용 : 'kotlin-android-extensions' 에서 View Binding으로 교체하고 싶습니다. 상황설명 : (1) 실습후 빌드하면 'kotlin-android-extensions' 이 종료되었다고 합니다. 이로 인해 실습을 따라하면 빌드 에러가 발생되고 있습니다.(참고사진-1) (2) 참고사진-1에서 빌드 콘솔에 나오는 가이드 개발자 사이트의 설명에 따라 View Binding으로 코드를 갱신하고 있습니다만 GridViewAdapter.kt등에 어떻게 적용해야 할지 감을 못 잡고 헤메고 있습니다.[참고사진-1.build시 에러 장면][참고사진-1.build의 콘솔 내용]The 'kotlin-android-extensions' Gradle plugin is no longer supported. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.android.com/topic/libraries/view-binding) and the 'kotlin-parcelize' plugin. 조언 등을 부탁드립니다. 감사합니다. 부록.해당 실습예제코드(gitHub)https://github.com/BoSeongGim/practice_coding/tree/main/andorid(mobile)/clone_cording(cording_peoples)
-
미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
에러
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.DataBinding 과 data class 강의 듣고잇는중입니다xml에서 버튼에 myClick을 연결시킨 부분부터 애뮬레이터에서 버튼을 누르면 애플리케이션이 자동종료됩니다.코드를 똑같이 따라쳣는데 왜 이렇게 된건지모르겟습니다.에러내용입니다(코드내용 똑같다고 보면 될거같습니다.) <?xml version="1.0" encoding="utf-8"?> <layout 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"> <data> <variable name="user" type="com.actual.jetpack_ex_databinding2.Person" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:id="@+id/test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= "@{user.name}" android:textSize="50sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= "@{Integer.toString(user.age)}" android:textSize="50sp" /> <TextView android:textSize="100dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.age > 30 ? `나이 많음` : `나이 적음`}" /> <Button android:text = "btn" android:onClick="myClick" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </layout> package com.actual.jetpack_ex_databinding2 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.View import androidx.databinding.DataBindingUtil import com.actual.jetpack_ex_databinding2.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding var testCount = 20 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_main ) // binding.test.text= "바뀐 텍스트" val person = Person("개복치", 20) binding.user= person fun myClick(view : View) { Log.d("MainActivity", "onClick") testCount++ val person = Person("개복치", testCount) binding.user = person } } } package com.actual.jetpack_ex_databinding2 data class Person ( val name : String, val age : Int )FATAL EXCEPTION: main Process: com.actual.jetpack_ex_databinding2, PID: 7731 java.lang.IllegalStateException: Could not find method myClick(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.material.button.MaterialButton at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:506) at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:464) at android.view.View.performClick(View.java:7659) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1213) at android.view.View.performClickInternal(View.java:7636) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:30156) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8177) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) 그전까지는 잘 되는거로 보아 onClick="myClick" 부분이 문제인것같은데 잘 못찾겟습니다.
-
해결됨[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
초급용 미리보기 영상을 보며 따라하고 있습니다.
안녕하세요!1) 초급용 추천받아서 미리보기로 영상을 따라하고 있는데 영상과 다르게 'build configuration language'가 계속 뜨고2) 'android studio' 다운 받을 때 저는 'android studio giraffe'로 다운을 받았는데 이건 버전을 나누기 위해 다른 게 맞나요?