05.11 Intent 화면 이동, 데이터 송수신, 리스트뷰

최고고·2022년 5월 11일
0

다른화면으로 데이터 보내기


  • 버튼 클릭 이벤트 :
    Logcat에 보낸 데이터 확인하기
    문자, 정수, 배열 타입 데이터 하나로 묶는 VO생성하기
    새로운 클래스 만들어준다.--> MemberVO 클래스에 필드선언, 생성자, 게터세터
    public class MemberVO implements Serializable { => implements Serializable !!! 직렬화 시켜줘야됨
  • 자바파일
    Intent intent = new Intent(getApplicationContext(),MainActivity2.class);
    vo타입으로 자료 담아줌
    오브젝트를 기본자료형처럼 직렬화시킴 : MemberVO vo = new MemberVO(name,age,hobby);
    intent.putExtra("vo",vo);
    startActivity(intent);
package com.example.ex220511;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button btn_move;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_move = findViewById(R.id.btn_move);
        btn_move.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(),MainActivity2.class);

                String name = "박병관";
                int age =20;
                String[] hobby = {"등산","물멍","자전거","운동"};

                MemberVO vo = new MemberVO(name,age,hobby);


                intent.putExtra("vo",vo);   //오브젝트를 기본자료형처럼 직렬화시킴

                startActivity(intent);


            }
        });

    }
}
  • 데이터를 받는 액티비티.자바 파일 --> 새로운 empty activity.xml 만들어줬음
    Intent intent = getIntent();
    MemberVO vo = (MemberVO) intent.getSerializableExtra("vo"); : 직렬화시킨 vo를 다운캐스팅
    Log.v("myData", vo.toString());
    Logcat에 myData 검색시 확인 가능
package com.example.ex220511;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Intent intent = getIntent();

        MemberVO vo = (MemberVO) intent.getSerializableExtra("vo");
        //직렬화시킨 vo를 다운캐스팅
        Log.v("myData", vo.toString());


버튼 클릭시 다른화면에서 데이터 받아오기

3화면 -> 4로 이동 4에서 데이터담아서 -> 데이터를 3으로 이동,화면도 이동

  • 3의 자바파일
    클릭이벤트 :
    Intent intent = new Intent(getApplicationContext(),MainActivity4.class);
    받아올 데이터가 있을 때 : startActivityForResult
    요청코드는 어디에서가져오는지 코드로 구분 내가지정함
    startActivityForResult(intent,1004);

  • 받아오는 onActivityResult 메소드 오버라이딩 메소드 재정의 해야됨

    매개변수 : (int requestCode, int resultCode, @Nullable Intent data)
    지정한 요청코드, 4에서 처리된 result코드, 인텐트
    조건문 : requestCode==1004 && resultCode == RESULT_OK
    Log.v("myData",data.getStringExtra("name"));

package com.example.ex220511;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity3 extends AppCompatActivity {
    private Button btn_result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        btn_result = findViewById(R.id.btn_result);

        btn_result.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(),MainActivity4.class);
                startActivityForResult(intent,1004);
                //받아올 것이 있을때 : startActivityForResult
                // 요청코드 어디에서 가져오는지 코드로 구분

            }
        });

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //activity4에서 넘어온 intent 를 처리하는 부분
        // 1004 내가보낸코드, 4에서 잘받았다는 코드
        if(requestCode==1004 && resultCode == RESULT_OK){
            Log.v("myData",data.getStringExtra("name"));
        }
    }
}
  • xml
  • 4 화면 자바파일
    네임값을 보낼때, 인텐트를 새롭게 만듦, 겟컨텍스트 안해도됨: Intent intent = new Intent();
    보낼 네임값 : intent.putExtra("name","박병관");
    잘 수신됐다는 상수 RESULT_OK : setResult(RESULT_OK,intent); 현재페이지 받아줌: finish();
package com.example.ex220511;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity4 extends AppCompatActivity {
    private Button btn_return;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        btn_return = findViewById(R.id.btn_return);
        btn_return.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                Intent intent = new Intent();       //네임값을 보낼때, 인텐트를 새롭게 만듦, 겟컨텍스트 안해도됨
                intent.putExtra("name","박병관");
                setResult(RESULT_OK,intent);        //잘 수신됐다는 상수 RESULT_OK
                finish();       //현재페이지 받아줌

            }
        });
    }
}


ListView

  • 안드로이드 화면에서 목록으로 보여지는 부분
  • 리스트뷰는 바로 보여지지 않고 어댑터 뷰가 필요함
    어댑터 통해 리스트 넣어줌 ArrayAdapter 이용해 넣어줌

    리스트뷰, 에딧텍스트, 버튼 위치시켜준다.

어플 실행 시 나오는 리스트뷰 출력

  • listview는 ArrayList형태로 들어감
    ArrayList 선언 후 .add
    new ArrayAdapter<>(getApplication(), android.R.layout.simple_list_item_1, item);
    매개변수 : 어플정보, 디자인, 데이터(아이템)
    android.R.layout.simple_list_item_1 기본 디자인 적용하겠다는 뜻
    listview에 어댑터 적용 : listView.setAdapter(adapter);

item 클릭을 감지

  • 익명클래스 클릭리스너 이용하기 setOnItemClickListener
    onItemClick 오버라이딩
    (AdapterView<?> adapterView, View view, int i, long l) 매개변수 : AdapterView<?>=어떤데이터타입인지 모른상태 listView클릭시나오는 어댑터, View view=리스트뷰, i=클릭한 위치값, l= 눌렀는지안눌렀는지 체킹부분
    클릭되어지는 값을 변수에 담고, 받아오는 데이터타입에 맞게 다운캐스팅 (String)
    해당 데이터를 토스트메시지로 출력해줌
    `Toast.makeText(getApplication(), value, Toast.LENGTH_SHORT).show();``

`

길게 클릭시 삭제

setOnItemLongClickListener익명 클래스
onItemLongClick 오버라이딩 : onItemLongClick(AdapterView<?> adapterView, View view, int i, long l)
데이터 변경을 알림 :adapter.notifyDataSetChanged(); `

EditText에 입력 시 ArrayList에 추가함

setOnClickListener
onClick 오버라이딩
edit_input.getText().toString(); ->ArrayList에 add
데이터 변경을 알림 : adapter.notifyDataSetChanged();

package com.example.ex220511;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity5 extends AppCompatActivity {
    private ListView listView;
    private ArrayList<String> item = new ArrayList<String>();       //listview는 ArrayList형태로 들어감
    private EditText edit_input;
    private Button btn_input;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main5);
        listView = findViewById(R.id.listview);
        edit_input = findViewById(R.id.edit_input);
        btn_input = findViewById(R.id.btn_input);


        item.add("마라탕");
        item.add("양갈비");
        item.add("소곱창");
        item.add("소막창");
        item.add("소대창");
        item.add("특양구이");
        item.add("와플");
        item.add("꽃삼겹");
        item.add("스테이크");
        item.add("육회");
        item.add("항정살");

        //아이템(어레이리스트)
        //리스트뷰 는 바로 들어가지 않고 어댑터 뷰가 필요함
        //어댑터 통해 리스트 넣어줌 array 어댑터 이용해 넣어줌

        ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplication(), android.R.layout.simple_list_item_1, item);
        // 매개변수 - 어플정보, 디자인, 데이터
        // android.R.layout.simple_list_item_1 기본 디자인 적용하겠다.

        listView.setAdapter(adapter);       //listview에 어댑터 적용



        //item 클릭을 감지함
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                // 매개변수 : <?> 어떤데이터타입인지 모른상태-  listView클릭시나오는 어댑터, 리스트뷰, 클릭한 위치값, 눌렀는지안눌렀는지 체킹부분

                String value = (String )adapterView.getItemAtPosition(i);       //받아오는 데이터타입에 맞게 다운캐스팅
                Toast.makeText(getApplication(), value, Toast.LENGTH_SHORT).show();

            }
        });

        //길게 클릭시 삭제
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                item.remove(i);
                adapter.notifyDataSetChanged();     //데이터 변경을 알림

                return false;
            }
        });

        btn_input.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String input = edit_input.getText().toString();
                item.add(input);
                adapter.notifyDataSetChanged();         //데이터 추가 --> 변경사항 알림
                edit_input.setText("");
            }
        });



    }
}

0개의 댓글