본문 바로가기

끄적끄적 ( 비공개 )

안드로이드 5일차

그냥 서브창 열기 
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