그냥 서브창 열기
start activity
결과를 받기 위한 서브창 열기
1,결과를 보냈을때 할일 등록
activityResult = reginster For Activity(ActivityResultContracts.StartActivityForResult()){
결과에 따라 할일
}
2.결과를 보낼때
Intent ( 새액티비티실행을 위한 의도를 전달한다.) = Intent(this, SubActivity::class.java)
startActiviy(intent)
3.데이터를 어떻게 주고받을것인가
기본적으로 객체에서는 데이터를 어떻게 주고 받나요?
보통 메소드(데이터로 인자) 호출을 하잖아요
데이터 값들을 넣어주면서
안드로이드에서는 Intent를 통해서 데이터를 주고받는다.
# Main - > Sub
val intent =
intent . putExtra("key1","value1")
activityResult.launch(intent)
# Main < - Sub
val returnIntent = Intent()
returnINtent . putExtra("key","value);
setReult( RESULT_OK,returnIntent);
finish()
- 부모창에서 받기 ( 할일등록하는곳에)
activityResult = registerForACtivityResult(ActivityResultContracts.StartActivityForResult(){
it.data? getStringExtra("Key");
}
============================
class MainActivity : AppCompatActivity(){
//상속 - > 동일한 성질을 포함한다 : 동일 + 추가 + 변형 (정하지 못한것 , 과거의 것을 변경)
// 창 : 최초보일떄 ,움직일떄, 닫힐때 > 각 상황별로 이미 함수를 마련하고 ( 생명주기)
}
============================
onCreate : 무대 가 보이기전, 무대 뒤에서 준비함
onStart() 보이기 직전
override fun onResume(){
super.onResume() // 기본적으로 할일
// 내가할일 코딩
============================
컨테이너
동적으로 데이터를 출력 ( 데이터를 가져와보니 데이터 갯수가 몇개이다. 이 갯수에 연연하지 않고동작하도록 코딩 )
=========================
화면에 보여줄 영역크기, 데이터 갯수에 대한 문제 가 생긴다. >> 100개를 다보여주는 무식한 방법이 잇는다.
Spinner > ArrayAdapter > 화면 ( 어뎁터 : 홀더제공 ,데이터 갯수 )
컨테이너 > 홀더 ( 아이템 하나만 보여줌)
컨테이너 : 화면크기에 필요한 만큼의 홀더를 보유함( 스크롤시 위아래로 어느데이터가 보여야 하는지 ( 데이터바인딩 ) 를 제공함
}
콜백함수 :
1.어댑터( 어뎁터를 만들떄는 레이아웃과 데이터가 필요하고 매개변수로 제공한다)
val adapter = ArrayAdapter<String( this, android.R.layout.simple_list_item_1 , data) ;
이 레이아웃은 한개만 보이게 만든 레이아웃이다.
2. 스피너(container)의 어뎁터는 위의 어뎁터이다. ( 컨테이너에 연결 )
binding.spinner1 .adapter = adapter
3. 스피너에 리스터 등록 AdapterView.OnItemSelectedListenrer{
}
스피너
컨테이너 > 어댑터(에게레이아웃과 데이터를 제공)
ㅣ 홀더생성및제공
ㄴ보유- 홀더
item 레이아웃 ( 기본제공, 우리가 만든것 있음)
newArrayList<Memo> (){
listOf() > 한번 만들어두면 길이 고정
mutableListOf() > 길이 가변
var listData = mutableListOf<Memo> ()
val binding = ItemRecyclerBinding.inflate(LayoutInflater . from(parent.context),
return Holder( binding )
}
val binding = ActivityMainBinding.inflate( layoutInflater )
setContentView(binding.root)
val data : MutableList<Memo> = loadData()
val adapter = CustomAdapter()
adapter.listData =data
binding.recyclerView.adapter = adapter
binding.recyclerView.layoutManager = LinearLayoutManager( this ,
fun loadData() : MutableList<Memo> {
}
===============
SubActivity 코드
============
프래그먼트 트랙젝션
val transaction = supportFragmentMangeer. beginTransaction():
transaction .add ( Layout.id , fragment )
transaction. commit()
FragmentContainerView 에 직접삽입
============
메인함수에 프레그먼트 붙이기
fun setListFramgnet(){
val listFragment = ListFragmnet()
val transaction = supportFragmentMangeer. beginTransaction():
transaction .add ( Layout.id , fragment )
transaction. commit()
}
val data: MutableList<Memo> = loadData()
val adapter = CustomAdapter()
adapter.listData = data
binding.recyclerBiew.adapter = adapter
binding.recyclerBiew.layoutManager = LinewarLayoutManager(This)
binding.btnSave.setOnclickListner{
//메모저장 버튼 클릭
val title = binding.editTextTextMultiLine1.text.toString()
if(title.isEmpty()){
val memo = Memo(null,title,System.currentTimeMillis())
val memo = Memo(null,title,Systme.cuttenTimeMillies())
memoDAO.save(memo)
adapter.listData.clear()
adpater.listData = loadData()
adapter.notify DataSet Changed()
binding.editTextTextMuliLine1 .setText("")
}
====================================
sqlite 의 추상 레이어 제공 ,
sqlite 객체를 매핑 해준다.
slite 의 기능을 모두 사용하게 해주고, dB로의 접근을 편하게 도와주는 라이브러리아
Entity - DB 안에 있는 테이블을 클래스로 나타낸것.
DAO - database 에 접근해서 실질적으로 insert, delete 를 수행하는 메소드.
Database - database holder 를 포함한다.
어디서 불러도 memoDAO 를 불러도 똑같은 객체를 사용할 수 있또록
싱글톤 패턴을 적용 > 그를 위해서 object 를 붙인다.
object DAOFactory{
lateinit var memoDAO:MemoDAO
}'
========================================
어디서 불러도 memoDAO 를 불러도 똑같은 객체를 사용할 수 있또록
싱글톤 패턴을 적용 > 그를 위해서 object 를 붙인다.
object DAOFactory{
lateinit var memoDAO:MemoDAO
}
홀더가 행하나에 대해서 표현해주는걸 담당하고 있는데,
홀더의 삭제버튼을 클릭했을때 삭제 이베느가 발생하는게 핵심
데이터 팩토리의 DAO 를 결국 아까 초기화한 메모 DAO 객체를 부르게 된다. 즉,
DAO.Factory.memoDAO = MemoDAO () 는 언제 어디서 코드를 작성해도 같은 DAO 를 사용하게 된다.
홀더에서 삭제버튼을 누르면
adapter 의 listData에서 .remove() 해준다.
adapter 는 홀더에게 데이터를 제공해준다고 보면된다.
object DAO Factory{
lateinit var memo: MemoDAO(this) / /읽기 전용(val)으로 하는게 아니라면 초기화가 나중에된다.
}
=============================
아래의 2가지 경우가 모두 같은것이다.
class A ( a:int , b:int){
init{ }
}
class B {
constructor (a:int, b:int ) { }
}
=============================
쓰레드
프로그램이 처음 실행되면 메인쓰레드가 생긴다.
필요하면 써브 쓰레드들이 생성된다.
당연히 서브쓰레드 내부에서 쓰레드를 생성할 수 잇다.
동시에 두가지 일을 한다. ( A조금 B조금)
==============================
MainActivity.kt 의 onCreate 에서
val helper:Roomhelper(DAO를 만들수 있음) = Room.databaseBuilder(this,RoomHelper::class.java, "memodb")
.allowMainThreadQueries().build()
DAOFactory.memoDAO= helper.memoDAO() // 헬퍼는 DAO 를 만들어 낼 수 있다.
==================================
recyclerView 는 많아지면 알아서 스크롤을 생성해준다.
==================================
[데이터전송]
## 엑티비티 to Fragment ##
프로젝트이름 바꾸려면 string.xml 에서 바꿔라
fun setFragment(){
val listFragment = ListFragment()
val bundle = Bundle() //번들에 담아서
bundle.putSring()
listFragment.argument = bundle // 인자로 붙이고
val transaction = supportFragmentManager.bdginTransaction() //프래그먼트 트랜젝션 시작
transaction.add( , listFragment)
transaction.commit()
}
## Fragment To Fragment ##
1. 리시브프레그먼트에서 setFragmentResultlistner 설정
2. 센더 에서 setFragmentResut ( 번들이름 ,번들객체 ) 번들에 데이터 포장해서 보내준다.
3. 해당 프레그먼트에 전달.
======================================
[안드로이드 운영[
Android Manifest .xml 에 있다.
## 결과를 받기위함 ##
register For Activity Result 결과를 받기 위한 어던 결과를 원하는 창(모든종류) 들이 보냇을떄할 일을 등록한다.
registerFrActivityResult ( 여기에 아래 것들이 들어가면 된다. )
서브액티비 > startActiviyFor Result()
권한요청떄는 Request For Permitsion >
카메라 앱일떈 Take a Picture
여기에 따라서 Intent( 위의것이 여기들어감) 가 바뀌게 된다.
var 권한허용창결과 할일등록지 = register ForActivityResult(ActivityResuoltcontracts.RequestPermission()){
if(it == true ) { // 허용을 눌렀을떄
val photoFile =File.createTempFile("IMF_ " ,".jpg",getExternalFiesDir(DIRECTORY_PICTURES))
photoUri = FileProvider.getUriForfile(this,"${packagename}.provider",photoFile)
}
}
=====================
class MainActivity : AppCompatActivity(){
onCreate(){
var thread = workThread()
thread.start()
while (i<10) {
Thread.sleep(10) // 잠시멈춰라
i+= 1
Log.i("thread", "mainTread");
}
}
class WorkTread: Tread(){
override fun run(){
var i =0
while (i<10) {
Thread.sleep(10) // 잠시멈춰라
i+= 1
Log.i("thread", "subTread");
}
======================
[타이머 만들기]
쓰레드 가 다르면 함수호출은 안된다. 그런데 메세지전달은 서비스 ( handler ) 을 의 handleMessage 르 ㄹ오버라이드해해서 가능하다.
화면을 고치는건 메인스레드 안에서만 가능하다.
서브스레드에서는 자신들이 직접 화면의 숫자를 바꿀수 없다. 그래서 메세지를 통해서 메인스레드에게 숫자를 바꾸라고 얘기한다.
'끄적끄적 ( 비공개 )' 카테고리의 다른 글
포큐 c++ 정리및 질문 리스트 (0) | 2023.01.24 |
---|---|
day3정리 (0) | 2022.11.02 |
기술면접 질문 정리 (0) | 2022.05.12 |
취업전 해보고 싶은것 (0) | 2020.09.24 |
스프링 프로젝트를 하면서 느끼는 점들 (0) | 2020.07.01 |