상세 컨텐츠

본문 제목

[Android Studio] 3. 화면 여러 개 만들기

Emzi(김민근)/android

by Emzi 2020. 2. 16. 18:14

본문

*해당 포스팅은 커넥트 재단의 edwith-[부스트 코스] 안드로이드 프로그래밍의 강의 자료를 바탕으로 작성되었습니다.

1. 인텐트

인텐트는 액티비티에서 다른액티비티로 넘어갈 때 액티비티 매니저로부터 정보를 넘길 때 사용하며, startActivry()를 사용하여 파라미터로 전달합니다.

Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
startActivityForResult(intent, 101);

startActivityForResult는 requestCode를 부여하여 전달하는데 인텐트 객체가 시스템으로 전달되어 구체적으로 액티비티 매니저에게 전달됩니다. 액티비티 매니저는 지정한 액티비티를 실행하여 화면에 보여줍니다.

<예제>

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button)findViewById(R.id.button);
        final EditText editText = (EditText)findViewById(R.id.editText);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String receiver = editText.getText().toString();

                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel: "+receiver));
                startActivity(intent);
               //Intent intent2 = new Intent();
                //ComponentName name = ComponentName ("com.example.callintent","com.example.callintent.MainActivty" );
                //intent2.setComponent(name);
                //startActivity(intent2);
            }
        });
    }
}

예제는 전화화면으로 인텐트를 사용하여 정보를 넘겼습니다. 

 

2. 부가데이터

레이아웃에서 다른 레이아웃으로 넘길 때 인텐트를사용하여 데이터를 넘길수 있습니다. 인텐트는 이때 바구니 역할을 하며 새로운 레이아웃이 생설될 때 인텐트에서 정보를 빼와서 쓰는 방식입니다. 메소드는 putExtra()로 정보를 넣으며, getExtra()로 정보를 가져옵니다 이때 getExtra()는 getStringExtra()로 데이터형을 사용하여 가져와야함을 유의해야합니다. 

<예제(Main)>

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class );
                startActivityForResult(intent,101);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 101){
            String name = data.getStringExtra("name");
            Toast.makeText(getApplicationContext(),"메뉴화면으로 응답"+name,Toast.LENGTH_LONG).show();

        }
    }
}

메인에서 메뉴로 넘길때 startActivityForResult()를 사용해서 넘겼습니다. reQuestCode를 101로 받아 나중에 돌아올 때 onActivityResult를 오버 라이딩하여 getStringExtra()로 받았습니다

 

 

<예제(Menu)>

public class MenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
        Button button = (Button)findViewById(R.id.button2);
        final EditText editText =(EditText) findViewById(R.id.editText);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("name", editText.getText().toString());
                setResult(Activity.RESULT_OK,intent);
                finish();
            }
        });


    }
}

메인 액티비티로 보낼 때 putExtra()를 사용하여 인펀트 매니저한테 데이터를 보냈습니다. setResult()를 사용하여 결괏값을 세팅해주고 finish()로 액티비티를 끝내여 메인으로 돌아갔습니다.  

 

3.Parcel

put... 과 get... 메서드는 이용해 인텐트에 넣을 수 있는 부가 데이터의 자료형(Type)은 Boolean, Integer, Float, String과 같은 기본 자료형들만 넣을 수 있습니다. Person과 같이 임의로 선언한 객체들은 넣을 려면 일일이 나누어야 하는 번거로움이 있습니다. 

Parcal은 이러 한 객체라던가 여러 개의 데이터형을 저장할 때 주로 쓰입니다. 

 

<예제 (parcel)>

public class SimpleData implements Parcelable {
    int number;
    String message;

    public SimpleData(int number, String message) {
        this.number = number;
        this.message = message;
    }
    public SimpleData(Parcel src){
        number = src.readInt();
        message = src.readString();
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){
        public SimpleData createFromParcel(Parcel src){
            return new SimpleData(src);
        }
        public SimpleData[] newArray(int size){
            return new SimpleData[size];
        }
    };
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(number);
        dest.writeString(message);
    }
}

parcel은 Parcelable의 인터페이스로 구현하며 createFromParcel메서드로 데이터를 Parcel로 만들어줍니다.

여기서는 SimpleData에 int형인 number와 String인 message로 구성하였습니다.

 

<예제(main)> 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button =(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),MenuActivity.class);
                ArrayList<String> names = new ArrayList<String>();
                names.add("김민근");
                names.add("김선홍");

                intent.putExtra("names",names);
                SimpleData data = new SimpleData(100,"hello");
                intent.putExtra("data",data);
                startActivityForResult(intent, 101);
            }

        });

    }
}

메인에서는 ArrayList에 각 원소를 넣어 ArrayList를 넘겼고, Pacel를 이용하여 100이라는 number와 "hello"라는 message를 넘겨주었습니다.

 

<예제(menu)>

public class MenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        Button button = (Button)findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                finish();
            }
        });
        Intent passdIntent = getIntent();
        processIntent(passdIntent);
    }
    private void processIntent(Intent intent){
        if (intent != null){
            ArrayList<String> names = (ArrayList<String>)intent.getSerializableExtra("names");
            if (names != null){
                //Toast.makeText(getApplicationContext(),"갯수"+names.size(),Toast.LENGTH_LONG).show();
                Toast.makeText(getApplicationContext(),names.get(0)+names.get(1)+names.size(),Toast.LENGTH_LONG).show();
            }
            SimpleData data = (SimpleData) intent.getParcelableExtra("data");
            if (data != null){
                Toast.makeText(getApplicationContext(),+data.number+data.message,Toast.LENGTH_LONG).show();
            }

        }
    }
}

ArretList는 getSerializableExtra()로 받았고 Pacel은 getParcelableExtra()로 받았습니다. 이 처럼 여러 개의 데이터를 보낼 때 사용하는 방법이 크게 2개가 있으며 Serializeable과 Parcel로 보내는 방법이 있습니다.

 

Serializeable 이용

 

Pacel 이용

<project>

 

이번 3주 차 프로젝트는 작성하기 버튼 구현과 Parcel로 저장하여 어댑터로 모두 보기 레이아웃에 인텐트로 넘기는 작업을 하였습니다. 처음에는 작성한 정보가 ListView에 쌓여서 순차적으로 보여져야하는데 계속 겹쳐지는 현상이 발생해서 많이 힘들었습니다. 어뎁터를 지역변수로 선언해서 일어난 문제였는데 전역변수로 선언하여 문제를 해결하였습니다.

다음은 모두보기 레이아웃에 ArreyList의 정보를 순차적으로 모두 보내여져야하는데 이는 일일이 넘겨서 계속 겹쳐지는 현상이 발생하였습니다. Parcel를 이용하여 ArretList를 통째로 넘겨서 문제를 해결하였습니다.


3주 차를 진행하면서 점점 어려워지고 있다는 것을 느꼈습니다. 나중에 네트워킹, 데이터베이스를 들어가기 위해 복습을 탄탄히 해놓아야겠습니다.

관련글 더보기

댓글 영역