반응형

이번 포스팅은 Android에서 키보드가 뷰 레이아웃에 영향 주지 않게 하는 방법에 대하여 알아보도록 하겠습니다.

 

화면에서 어떠한 정보를 입력하기 위해 우리는 소프트웨어 키보드가 화면 하단에서 상단으로 업로드가 되며 데이터를 입력할 수 있습니다.

 

이때 키보드가 위로 업로드되면서 기존에 화면에 있던 레이아웃들이 영향을 받게 되는 경우가 있습니다.

 

예를 들어 기존에 화면에 있던 레이아웃이 layout_weight로 구성이 되어 있다면 키보드가 위로 업로드되면서 기존에 화면에 있던 레이아웃들은 정한 layout_weight 값에 따라 화면이 조정이 됩니다.

 

하지만, 키보드가 업로드되면서 기존에 화면에 있던 레이아웃에 영향을 주지 않고 싶을 땐 어떻게 할까요?

 

바로 AndroidMenifest.xml에서 해당 Activity 정보에 windowsoftInputMode 설정을 재정의 해주면 됩니다.

 

 

# adjustNothing




  <activity name = ".InputActivity"
    activity android: windowsoftInputMode = "adjustNothing"
           ......
    />

 

위와 같이 adjustNothing을 설정해주면 '화면에서 어떠한 것도 조정하지 않는다'는 의미로 기존에 화면에 있던 레이아웃을 건들지 않고 키보드만 위로 업로드가 됩니다.

 

참고) 이와 반대로 적용을 하고 싶다면 adjust 속성으로 변경하시면 adjustNothing과 정반대로 작동을 합니다.

 



 주의) adjustNothing 적용 시 키보드가 화면을 가릴 수 있습니다.


          이 점은 적용시 주의해야 합니다.

 

 

# adjustResize




   <activity name = ".InputActivity"
    activity android: windowsoftInputMode = "adjustResize"
           ......
    /> 

 

위와 같이 adjustResize을 설정해주면 '화면에서 키보드가 올라와도 EditText와 UI가 화면에 보이도록 Activity를 resize 한다.'라는 의미입니다.

 

따라서 스크롤이 적용되어 키보드가 가린 부분을 화면을 아래로 밀어 내리면서 사용자가 볼 수 있습니다.

 

반응형
반응형

이번 포스팅은 가비지 컬렉션 로그 메시지와 해결방법에 대하여 알아보도록 하겠습니다.

 

 
  04-10 15:54:53.515: D/dalvikvm(14465): GC_CONCURRENT freed 535K, 38% free 10769K/17287K, paused 2ms+2ms 

 

=> Heap 영역에 메모리가 차 오르는 순간 자주 보이는 가비지 컬렉션 로그로 정산 동작.

     많으면 많을수록 가비지 컬렉션으로 PAUSE 되는 시간 때문에 RUNTIME에 영향을 주게 됩니다.

     해당 메시지가 나오지 않게 하려면, 짧은 시간에 발생하는 객체 생성을 줄여야 합니다.

반응형
반응형

1. Context의 정의


Application 환경에 관한 글로벌 정보를 접근하기 위한 인터페이스, Abstract 클래스이며 실제 구현은 Android 시스템에 의해 제공이 됩니다. Context를 통해 Application에 특화된 Resource 클래스에 접근할 수 있을 뿐만 아니라, 추가적으로, Application 레벨의 작업 - Activity 실행, Intent 브로드 캐스팅, Intent 수신 등을 수행하기 위한 API를 호출할 수 있습니다.

 

2. Context의 역할


- 어플리케이션에 관하여 시스템이 관리하고 있는 정보에 접근하기

- 안드로이드 시스템 서비스에서 제공하는 API를 호출할 수 있는 기능

 

Context 인터페이스가 제공하는 API 중, getPackageName(), getResource() 등의 method들이 첫 번째 역할을 수행하는 대표적인 method입니다. 보통 'get'이라는 접두어로 시작하는 method입니다. 그 외에, startActivity() 나 bindService()와 같은 method들이 두 번째 역할을 수행하기 위한 method라고 할 수 있습니다. 

반응형
반응형

InformationInput .java

 

package com.androidhuman.IntentTest;

 

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

public class InformationInput extends Activity {

 

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

final Button requestInfo = (Button)findViewById(R.id.requestInfo);

 

// 버튼을 클릭할 경우

requestInfo.setOnClickListener(new Button.OnClickListener(){

public void onClick(View v){

Intent intent = new Intent(InformationInput.this,InformationProc.class);

 

// Sub_Activity 호출

startActivityForResult(intent, 1); 

}

});

}

 

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data){

super.onActivityResult(requestCode, resultCode, data);

TextView name_view = (TextView)findViewById(R.id.name_view);

TextView digit_view = (TextView)findViewById(R.id.digit_view);

 

// 액티비티가 정상적으로 종료되었을 경우

if(resultCode==RESULT_OK) {

// InformationInput에서 호출한 경우에만 처리합니다.

if(requestCode==1) {

// 받아온 이름과 전화번호를 InformationInput 액티비티에 표시name_view.setText(data.getStringExtra("data_name"));

digit_view.setText(data.getStringExtra("data_digit"));

}

}

}

}

 

InformationProc .java

 

package com.androidhuman.IntentTest;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

public class InformationProc extends Activity {

 

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.informationproc);

Button input_info = (Button)findViewById(R.id.inputinfo);

input_info.setOnClickListener(new OnClickListener(){

 

//버튼을 클릭하면

public void onClick(View v) { 

// 이 액티비티를 시작하게 한 인텐트를 호출

Intent intent = getIntent(); 

EditText name_input = (EditText)findViewById(R.id.name_input);

EditText digit_input = (EditText)findViewById(R.id.digit_input);

intent.putExtra("data_name",name_input.getText().toString());

intent.putExtra("data_digit", digit_input.getText().toString());

 

// 추가 정보를 넣은 후 다시 인텐트를 반환합니다.

setResult(RESULT_OK,intent);

// 액티비티 종료 

finish(); 

}

});

}

}

 

참고 : http://androidhuman.tistory.com/125

반응형
반응형

이번 포스팅은 Intent FLAG에 대하여 알아보도록 하겠습니다.

 

Android  플랫폼에서 Activity 는 또 다른 Activity 를 시작할 수 있고, 각각의 Activity 는 차곡 차곡 Task 라고 불리우는 Activity Stack 에 쌓이게 됩니다. 사용자는 뒤로가기를 통해 현재 화면상에 보이는 Activity 를 종료시키고, 바로 직전에 사용된 Activity로 돌아갈 수 있습니다. 

 

구글에서는 Activity를 호출할 때 사용되는 Intent 에 적절한 플래그 값을 설정해서 Activity Stack 을 제어할 수 있는 방법을 제공해 줍니다. 이 플래그들은  FLAG_ACTIVITY 라는 접두어를 갖고 있는데, 개인적으로 가장 요긴하게 사용하고 있는 FLAG_ACTIVITY 네 가지를 소개해 봅니다. 

 

 

# FLAG_ACTIVITY_SINGLE_TOP


우선 간단하게 그림으로 표현해 보았습니다. 

A 와 B  두 가지 Activity가 있습니다. A라는 Activity는 B Activity를  호출하고, B라는 Activity는 다시 자기 자신인 B Activity를 호출하는 경우라고 가정해 보겠습니다. (A->B->B)

 

 


   
     
  B B(재사용)
A A A

           A                  A->B             A->B->B

 

- 호출하는 B Activity가 이미 Task 의 가장 앞에 위치하는 경우, 또 하나의 B Activity를 생성하지 않습니다.

- 기존에 존재하는 B Activity가 재활용이됩니다. 

- B Activity가 재활용된다는 것을 개발자가 알아채고 새롭게 전달되는 Intent를 사용할 수 있도록 합니다.

   (B Activity 의 onPause() / onNewIntent() / onResume() override 메소드가 순차적으로 호출이 됩니다.)

- 동일한 Activity 를 여러 번 생성하는 것은 메모리 사용량과 Activity 시작 속도 모두에 좋지 않습니다. 이런 경우 FLAG_ACTIVITY_SINGLE_TOP를 적절하게 활용하면 제법 큰 효과를 볼 수 있습니다.

 

 

 # FLAG_ACTIVITY_NO_HISTORY 


우선 간단하게 그림으로 표현해 보았습니다. 

A 와 B  두 가지 Activity 가 있습니다. A라는 Activity는 B를 B라는 Activity는 A를 호출한 후에 (A->B->A) 사용자가 뒤로 가기를 하는 경우를 가정해 보겠습니다.

 

                      <일반적인 경우>                                                       < FLAG_ACTIVITY_NO_HISTORY 적용>

 

             
    A        
  B B     B(흔적X) A
A A A   A A A

           A                   A->B             A->B->A                                      A                  A->B             A->B->A

 

 

- FLAG_ACTIVITY_NO_HISTORY 로 설정된 Intent로 시작된 Activity B는 Task에 그 흔적을 남기지 않게 됩니다. 

- B Activity에서 또 다른 A Activity를 호출한 후, 뒤로 가기를 누르면 일반적인 경우 이전에 실행되었던 B Activity가 나타나지만, FLAG_ACTIVITY_NO_HISTORY를 사용하는 경우 맨 처음에 실행되었던 A Activity가 화면에 표시됩니다. 

- FLAG_ACTIVITY_NO_HISTORY 를 사용하게 되면 Task에 해당 Intent의 정보가 기록되지 않기 때문에, A->B 인 상황에서 Home 버튼 등을 눌러 다른 Task로 전환된 후, 다시 본 Task로 돌아오게 되면, A Activity가 화면에 표시되는 점은 주의해야 합니다.

- 또한, B Activity 의 onDestroy()가 호출되는 시점이 조금 애매합니다. 일반적인 예상과는 달리, B Activity에서 또 다른 A Activity 를 호출하는 세 번째 단계에서는 onStop() 까지만 호출되고, 이 후에 새롭게 호출된 A Activity 가 뒤로 가기 등 Stack에서 사라지는 순간에서야 onDestroy() 가 호출됩니다.

- FLAG_ACTIVITY_NO_HISTORY 는 여러모로 쓸모가 있는데, 특히 특정한 이벤트 알람 등을 위해 Dialog 형태로 화면에 표시되는 Activity에 적용하기에 편리합니다. (대개의 경우 팝업은 해당 시점에 한 번만 보여주면 되니까.)

 

 

#FLAG_ACTIVITY_REORDER_TO_FRONT와 FLAG_ACTIVITY_CLEAR_TOP 


우선 간략하게 그림으로 살펴 보겠습니다. 

A Activity 에서 B Activity를 그리고 B에서 A를 호출하는 상황을 가정해보았습니다. (A->B->A)

 

                      < 일반적인 경우>                                       <FLAG_ACTIVITY_REORDER_TO_FRONT와 FLAG_ACTIVITY_CLEAR_TOP>

 

               
    A          
  B B     B A  
A A A   A A B A

           A                  A->B              A->B->A                                      A                   A->B           (순서 변환)       (A를 최상단)

 

 

- FLAG_ACTIVITY_REORDER_TO_FRONT 는 매우 특이하게도 Task의 순서 자체를 뒤바꿔 줍니다. 

- 호출하는 Activity가 이미 Task 상에 존재하는 경우 해당 Activity를 새롭게 생성하는 대신, 아래쪽에 위치한 Activity의 순서를 Task의 가장 위로 끌어올려줍니다. 

- A->B->A 의 순서로 Activity 호출이 일어날 때, 새로운 A Activity가 생성되는 대신 아래쪽에 위치한 A Activity가 위로 올라와 최종적으로 B->A의 형태로 Task 가 구성되게 됩니다. 

- 어떤 Activity에서 특정 Activity로 점프하는 형식의 Flow를 구성해야하는 경우 요긴하게 사용될 수도 있지만, Task의 순서를 뒤섞는다는 점에서 사용에 주의를 기울일 필요가 있습니다.  (아무 생각없이 남발하게 되면 뒤로 가기 시 엉뚱한 Activity 가 표시되어 사용자들이 굉장히 혼란스러워하는 경우가 있습니다.) 

 

- FLAG_ACTIVITY_CLEAR_TOP  플래그가 사용되는 경우  호출하는 Activity가 이미 Task 상에 존재하는 경우, 해당 Activity 위에 존재하는 다른 Activity 를 모두 종료시켜 줍니다. 

- A->B->A 로 호출이 일어나는 경우, B Activity 가 종료되고, A Activity 만 Task에 남게 됩니다. 

  (A->B->C->A 인 경우에도 마찬가지로 B와 C 가 종료되고 A 만 남게 됩니다.)

 

 

 

[출처] 안드로이드 알아두면 요긴한 FLAG_ACTIVITY 네 가지

반응형

'Development > Android' 카테고리의 다른 글

[Android] Context  (0) 2020.04.08
[Android] Activity 호출  (0) 2020.04.08
[Android] ArrayList 객체를 Intent로 전달하는 방법  (3) 2020.04.08
[Android] MoveEvent Value  (0) 2020.04.08
[Android] Picsasso vs Glide  (0) 2019.10.01
반응형

이번 포스팅은 ArrayList 객체를 Intent로 전달하는 방법에 대하여 알아보도록 하겠습니다.

 

1. 데이터 클래스의 직렬화

 

우선 인자로 전달하기 위해서는 ArrayList에 담기는 데이터 클래스가 직렬화(Serializable interface를 구현)가 되어 있어야 합니다.

 

public class Subway implements Serializable {

......

 

}

  

2. Intent에 데이터 담기

 

ArrayList <Subway> subwayList = new ArrayList <Subway>();

subwayList.add(new Subway(201, "시청"));

 

Intent intent = new Intent();

intent.putExtra("subway",  subwayList);

startActivity(intent);

 

3. 데이터 꺼내서 사용하기

 

ArrayList <Subway> subwayList = (ArrayList <Subway>) getIntent(). getSerializableExtra("subway");

반응형

'Development > Android' 카테고리의 다른 글

[Android] Activity 호출  (0) 2020.04.08
[Android ] Intent FLAG  (0) 2020.04.08
[Android] MoveEvent Value  (0) 2020.04.08
[Android] Picsasso vs Glide  (0) 2019.10.01
[Android] App Architecture 가이드 2  (0) 2019.09.23

+ Recent posts