[ Intent를 이용해 Layout 띄우기 ]

 

1. onClickLinstener()  안 에서 Layout 띄우기

   (즉, 클릭 Event에서 Layout 띄우기)

   - Intent intent = new Intent(getBaseContext(), AnotherActivity1.class);

   - Intent intent = new Intent(getApplicationContext(), AnotherActivity1.class);

   - Event에서는 Context()를 사용해야 됨.

     Event에서는 this를 사용할 수 없음.

 

2. ??

    Intent intent = new Intent(this AnotherActivity1.class);

'[Android] - 개념 > Intent' 카테고리의 다른 글

Intent() 정의  (0) 2016.12.04
Posted by 농부지기
,

 

[ Layout에서 별도 Layout 띄우기 ]

1. 소스 흐름 순서

    - MainActivity.java 에서

      activity_main.xml Layout 에서  another1.xml   layout을 띄우거나, another2.xml   layout을 띄울 수 있다.

      activity_main.xml <-> another1.xml

                             <-> another2.xml

    - MainActivity.java에서 띄워야 할 화면들이 여러 개가 되면서 띄웠던 화면을 닫고 원래 Main화면으로 돌아 올 때

      어느 띠웠던 화면에서 돌아 왔는지 알아야 될때가 있다

      또한 띠웠던 액티비티로부터 응답(param)값 받아 처리해야 되는 경우도 있다.

      

      startActivityForResult()를 이용해서 이 문제를 해결 할 수 있다.

 

2. startActivityForResult(Intent intent, int requestCode)

   - intent : 띄울 Activity

   - requestCode : 띄워야할 화면이 여러개 일 때 구분하기 위한 정수값

                        띄운 화면에서 사용할게 아니고,  띄웠던 화면이 닫히고 다시 Main화면으로 왔을때

                        어떤 화면에 돌아 왔는지 알기 위한 값이다.

 

3. onActivityResult(int requestCode, int resultcode, Intent intent)

   - 정의 : 띄었던 화면이 닫히면 자동으로 호출 되는 메소드

   - requestCode : 어떤 화면에서 돌아 왔는지 구분값

   - resultcode : 응답을 보내 온 액티비티로부터 전달된 값으로 보통 성공(200), 실패(400) 결과 값이 전달됨

                      (그런데, 왜 난 -1 값이 찍힐까????)

   - intent : 띄웠던 화면의 intent.  argument값을 들이 넘겨저 온다.

               응답을 보내 온 액티비티로부터 전달한 인텐트로 필요한 데이터가 있을 때 인텐트에 데이터를 넣어 전달.

 

 

[ AndroidManifest.xml ] - 아래 2개의 activity tag가 존재 해야 inflate를 할 수 있다.

<activity android:name=".AnotherActivity1"/>
<activity android:name=".AnotherActivity2"/>

 

 

[ MainActivity.java ]

/**
* 인텐트를 이용해 새로운 액티비티를 띄우고 다시 돌아오는 방법에 대해 알 수 있습니다.
*
* @author Mike
*/
public class MainActivity extends AppCompatActivity {

    /**
     * 요청 코드 정의
     */
    public static final int REQUEST_CODE_ANOTHER1 = 1001;
    public static final int REQUEST_CODE_ANOTHER2 = 2002;

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

    public void onButton1Clicked(View v) {
        switch(v.getId()) {
            case R.id.button1:
                // 인텐트 객체를 만드는 방법 #1
                // 인텐트 객체를 만듭니다.
                //getBaseContext(), getApplicationContext() 둘다 가능

                //AnotherActivity1.class 대신  this를 사용하기도 하지만 Event에서는 this를 사용할 수 없다.
                Intent intent = new Intent(getBaseContext(), AnotherActivity1.class);
                //Intent intent = new Intent(getApplicationContext(), AnotherActivity1.class);

                // 액티비티를 띄워주도록 startActivityForResult() 메소드를 호출합니다.
                //  - startActivityForResult(Intent intent, int requestCode)
                //  - requestCode : 띠운 AnotherActivity가 닫힐 때
                startActivityForResult(intent, REQUEST_CODE_ANOTHER1);
                break;
            case R.id.button2:
                Intent intent2 = new Intent(getApplicationContext(), AnotherActivity2.class);
                startActivityForResult(intent2, REQUEST_CODE_ANOTHER2);
                break;
        }


        // 인텐트 객체를 만드는 방법 #2
        //Intent intent = new Intent();
        //ComponentName name = new ComponentName("org.androidtown.intent.basic", "org.androidtown.intent.basic.AnotherActivity");
        //intent.setComponent(name);

        //startActivityForResult(intent, REQUEST_CODE_ANOTHER);

    }

    /**
     * 띄웠던 액티비티닫히면  자동 호출되는 메소드
     *  - requestCode : 이때 띄워주는 액티비티가 여러개 일때 어떤건지 구분하기 위한 값.
     *                  띄워줄때 넘겨줫던 requestCode 값을 다시 받게 된다.
     *                  그래야 어떤 화면에서 돌아 왔는지 알 수 있기 때문이다.
     */
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);

        if (requestCode == REQUEST_CODE_ANOTHER1) {
            Toast toast = Toast.makeText(getBaseContext(), "onActivityResult() 메소드가 호출됨. 요청코드 : " + requestCode + ", 결과코드 : " + resultCode, Toast.LENGTH_LONG);
            toast.show();

            if (resultCode == RESULT_OK) {
                String name = intent.getExtras().getString("name");
                toast = Toast.makeText(getBaseContext(), "응답으로 전달된 name : " + name, Toast.LENGTH_LONG);
                toast.show();
            }else if (resultCode == RESULT_CANCELED) {
                toast = Toast.makeText(getBaseContext(), "오류 발생", Toast.LENGTH_LONG);
                toast.show();
            }

        }else if (requestCode == REQUEST_CODE_ANOTHER2) {
            Toast toast = Toast.makeText(getBaseContext(), "onActivityResult() 메소드가 호출됨. 요청코드 : " + requestCode + ", 결과코드 : " + resultCode, Toast.LENGTH_LONG);
            toast.show();
        }
    }
}

 

 

 

[ AnotherActivity1.java ]  , AnotherActivity2.java 도 동일하게 생성

public class AnotherActivity1 extends Activity {
   Button backButton;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.another1);

        backButton = (Button) findViewById(R.id.backButton1);
     
      // 버튼을 눌렀을 때 메인 액티비티로 돌아갑니다.
        backButton.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
              // 객체를 만듭니다.
              Intent resultIntent = new Intent();
              resultIntent.putExtra("name", "mike");

                // 응답을 전달하고 이 액티비티를 종료합니다.
              setResult(RESULT_OK, resultIntent);
                finish();
         }
      });
    }
}

 

 

[ activity_main.xml ]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   android:orientation="vertical" >

   <LinearLayout
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:orientation="horizontal">
      <Button
         android:id="@+id/button1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="액티비티1 띄우기"
         android:textSize="10dp"
         android:onClick="onButton1Clicked"/>
      <Button
         android:id="@+id/button2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="액티비티2 띄우기"
         android:textSize="10dp"
         android:onClick="onButton1Clicked"/>
   </LinearLayout>

   <TextView
      android:id="@+id/textView"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@+id/button1"
      android:layout_marginTop="40dp"
      android:gravity="center_horizontal"
      android:text="위의 버튼을 누르면 새로운 액티비티가 띄워집니다."
      android:textSize="14dp"
      android:textColor="#ffad6535" />
</LinearLayout>

 

 

[ another1.xml ],   another2.xml 파일도 동일하게 생성

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="400dp" >

    <Button
        android:id="@+id/backButton1"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="돌아가기"
        android:textSize="22dp"/>
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@+id/backButton1"
      android:layout_marginTop="20dp"
      android:gravity="center_horizontal"
      android:text="위의 버튼을 누르면 메인 액티비티로 돌아갑니다."
      android:textSize="14dp"
      android:textColor="#ffad6535" />

</RelativeLayout>

 

 

 

 

 

 

 

 

 

'[Android] - 개념 > Layout' 카테고리의 다른 글

Layout에 다른 Layout넣기  (0) 2016.12.04
Posted by 농부지기
,

* Layout에 다른 Layout넣기 *

 

1. 화면 전체에 나타낼 Layout을 메모리 상에 객체화할 때는 setContentView()를 사용한다.

2. 화면 일부만 별로 Layout을 메모리 상에 객체화 하려면 별도 인플레이션 객체를 사용해야 된다.

   안드로이드에서는 LayoutInflater 클래스를 이용한다.

   이 클래스는 시스템 서비스로 제공되므로 getsystemService(Context.LAYOUT_INFLATER_SERVICE) 메소드를 사용하여

   객체를 참조한 후 사용해야 한다.

 

3. 아래 소스중 activity_main.xml 에서 보면 ["@+id/contentsLayout"] id인 LinearLayout에 위치에 별도 Layout을 넣게 된다.

 

 

[ activity_main.xml ]

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:gravity="center_horizontal"
        android:text="아래 버튼을 누르면 인플레이션으로 추가합니다."
        android:textSize="14dp"
        android:textColor="#ffad6535" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="인플레이션으로 추가하기"
        android:textSize="22dp"
        android:onClick="onButton1Clicked" />

    <LinearLayout
        android:id="@+id/contentsLayout"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    </LinearLayout>

</LinearLayout>

 

[ button.xml ]

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/selectButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="선택 "
        android:textSize="24dp"
        android:textStyle="bold"
        />
    <RadioGroup
        android:id="@+id/radioGroup01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        >
        <RadioButton
            android:id="@+id/radio01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="남성"
            android:textColor="#ffaaff10"
            android:textStyle="bold"
            android:textSize="24dp"
            />
        <RadioButton
            android:id="@+id/radio02"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="여성"
            android:textColor="#ffaaff10"
            android:textStyle="bold"
            android:textSize="24dp"
            />
    </RadioGroup>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical|center_horizontal"
        android:paddingTop="10dp"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="하루종일"
            android:textSize="24dp"
            android:paddingRight="10dp"
            android:textColor="#ffaaff10"
            />
        <CheckBox
            android:id="@+id/allDay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
    </LinearLayout>
</LinearLayout

 

 

[ MainActivity.java ]

/**
* 레이아웃 인플레이터를 이용해 레이아웃의 일부를 동적으로 로딩하는 방법에 대해 알 수 있습니다.
*
* @author Mike
*/
public class MainActivity extends AppCompatActivity {

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

    /**
     * 버튼을 눌렀을 때 레이아웃을 동적으로 로딩합니다.
     * @param v
     */
    public void onButton1Clicked(View v) {
        inflateLayout();
    }

    /**
     * button.xml 에 정의된 레이아웃을 메인 액티비티의 레이아웃 일부로 추가하는 메소드 정의
     */
    private void inflateLayout() {
        // XML 레이아웃에 정의된 contentsLayout 객체 참조
        LinearLayout contentsLayout = (LinearLayout) findViewById(R.id.contentsLayout);

        // 인플레이션 수행
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // inflate()메소드의 파라미터로 R.layout.button과 contentsLayout객체를 전달하고 앋.

        //이것은 contentsLayout을 부모 컨테이너로 하여 buttons.xml파일에 정의된 레이아우승ㄹ 추가하라는 의미이다.

        inflater.inflate(R.layout.button, contentsLayout, true);

        // 새로 추가한 레이아웃 안에 들어있는 버튼 객체 참조
        Button btnSelect = (Button) findViewById(R.id.selectButton);
        final CheckBox allDay = (CheckBox) findViewById(R.id.allDay);

        btnSelect.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (allDay.isChecked()) {
                    allDay.setChecked(false);
                } else {
                    allDay.setChecked(true);
                }
            }
        });
    }

 

 

 

 

 

 

 

 

 

 

 

'[Android] - 개념 > Layout' 카테고리의 다른 글

Layout에서 별도 Layout 띄우기  (0) 2016.12.04
Posted by 농부지기
,