액티비티에 붙여져 있는 View 를 구하는 방법 3가지에 대해


소개하고자 한다.






1. View 객체에 미리 담는 방법.


View view = getLayoutInflator.from(this).inflate(R.layout.main_activity,null);

setContentView(view);


윗 방법은 View 객체에 미리 view의 정보를 담은 후,


참조하고 싶을때 view라는 변수를 통해서 참조 하면 된다.



2. findViewById를 이용하여 View 객체에 담는 방법.


setContentView(R.layout.main_activity,null);

View view = findViewById(R.id.rootView);


윗 방법은 main_activity.xml 안에 최상위 부모뷰에


id를 rootView로 선언 한 뒤, 사용하면 된다.


위와 똑같이 view로 넣었지만 혹, ViewGrop으로 사용하고 싶을시,


다운캐스팅을 해준다. 아래의 예제를 보자.



ex) 뷰그룹으로 받고 싶을시,


ViewGroup viewGroup = (ViewGroup)findViewById(R.id.rootView);


ex) 부모뷰가 특정 ViewGroup일시 - FrameLayout


FrameLayout frameLayout = (FrameLayout)findViewById(R.id.rootView);



3. Activity의 context 정보로 구하는 방법


View view = context.getWindow().getDecorView() ;



윗 방법은 Activity의 context로 액티비티에 붙여져 있는 view를 구하는 방법이다.


이것 역시 ViewGroup 또는 특정 ViewGroup으로 받고 싶을때는 다운캐스팅 해준다.


아래의 예제를 보자.



ex) 뷰그룹으로 받고 싶을시,


ViewGroup viewGroup = ((ViewGroup)context.getWindow().getDecorView()) ;


ex) 부모뷰가 특정 ViewGroup일시 - FrameLayout


FrameLayout frameLayout = ((FrameLayout)context.getWindow().getDecorView()) ;



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

안드로이드는 기존에 자바에서 제공하는 Thread 뿐만아니라


AsyncTask라는 스레드 객체를 제공한다.


안드로이드가 AsyncTask 라는 객체를 왜 만들어 제공할까?


아래의 글은 Android Developer 에서 발췌한 일부 글이다.


AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as ExecutorThreadPoolExecutor and FutureTask.

An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread.



요약하자면, AsyncTask는 백그라운드 스레드 와 UI 스레드를 같이 쓰기 쉽게 설계했으며, 


일반 스레드와 달리, 간단한 작업에 적합하게 만들었다고 설명되어 있다.


백그라운드 스레드와 UI 스레드를 같이 쓰기 쉽다는 말이 무슨 뜻일까?


아래의 설명을 보자.



안드로이드에서의 일처리는 메인스레드(UI 스레드)가 담당한다. 특히 UI와 관련된( ex) TextView,ImageView )


일처리는 메인스레드만 담당 하게끔 설계를 했다. 그래서 메인스레드를 UI스레드라고도 불린다.



따라서 복잡한 계산은 백그라운드 스레드( 메인 스레드가 아닌 다른 스레드의 총칭)에 맡긴후 


계산된 결과값을 UI스레드에게 일을 시켜야 하는 것이다.


그래서 AysncTask 라는 객체를 만들었고 위에서 설명한 일들을 쉽게 구현 할 수 있도록 메서드를 제공한다.


아래의 AysncTask 예시를 보자.

import android.os.AsyncTask;

public class MommooAsyncTask extends AsyncTask<String,Void,String>{

public String result;

@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected String doInBackground(String... params) {
return result;
}

@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}


AsyncTask객체는 abstract로 작성되었다. 따라서, 익명클래스로 사용허던가 위와 같이 상속을 통해서 사용해야 한다.


public class MommooAsyncTask extends AsyncTask<String,Void,String>{


제네릭 인자3개를 정해야한다. 


첫번째 인자는 doInBackground 메서드에 선언하는 가변인수 매개변수의 타입을 정한다.


두번째 인자는 onProgressUpdate 메서드에 선언하는 가변인수 매개변수의 타입을 정한다.


세번째 인자는 onPostExecute 메서드에 선언하는 매개변수의 타입을 정한다.


@Override
protected void onPreExecute() {
super.onPreExecute();
}


첫번째 메서드다. 해당 메서드는 이름에서 볼 수 있드시,  background스레드를 실행하기전 준비 단계이다.


변수의 초기화나, 네트워크 통신전 셋팅해야할 것들을 위의 메서드 공간에 작성한다. 



@Override
protected String doInBackground(String... params) {
return result;
}


두번째 메서드다. 해당 메서드가 background 스레드로 일처리를 해주는 곳이다.


보통 네트워크, 병행 일처리등을 위 메서드 공간에 작성한다.


중요한건 마찬가지로 스레드 이므로 UI스레드가 어떤 일을 하고 있는지 상관없이


별개의 일을 진행한다는 점이다. 따라서 AysncTask는 비동기적으로 작동한다.



@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}


세번째 메서드는 doInBackground 메서드에서 중간중간에 UI스레드 에게 일처리를 맡겨야 하는 상황일때


쓴다. 매개변수로 Void를 받으므로, doInBackground안에 실제인자가 없이,


 publishProgress( ) 메서드를 호출하면 BackgroundThread 중간에 mainThread에게 일을 시킬 수 있다.



@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}


마지막 메서드다. background Thread가 일을 끝마치고 리턴값으로 result를 넘겨준다.


그 값을 지금 보고 있는 해당 메서드가 매개변수로 받은후 받은 데이터를 토데로


UI스레드에 일처리를 시킬때 쓰는 메서드이다.


보통 UI변경 ( ex) textview.setText("~~") )할때 많이 사용된다. 왜냐면


위에서도 말했다시피 UI변경은 메인스레드가 아닌 다른 스레드에서의 변경은 막았기 때문이다.


위에서 만든 AysncTask를 사용 하는방법은 아래와 같이 하면된다.


MommooAsyncTask asyncTask = new MommooAsyncTask();
asyncTask.execute();


execute의 아규먼트는 doInBackground에서 받는 String... 가변인수이다. 필요시 넣으면 되겠다.



해당 URL은 저번에 작성한 포스팅인데 AsyncTask를 사용하였다. 예시로 보면 될 것이다.


http://mommoo.tistory.com/5



여기까지가 준비한 AysncTask의 내용이다.


직접 Thread와 Handler 를 구현해보고 작성해봤다면,


안드로이드가 제공해주는 AysncTask가 얼마나 편리한지 알 수 있을 것이다.



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

소켓프로그래밍을 하거나 파일입출력을 할때


자바가 제공하는 스트림을 사용한다.


(InputStream , OutputStream)


하지만 Byre 단위라서 영어나 숫자등은 잘 출력되는데,


단위가 2바이트인 한글은 깨져서 출력된다.


그래서 char 단위인 InputStreamReader를 쓴다.


해당 클래스를 쓰면 한글도 잘 출력되지만, 한글자씩 받아와야 하는


상황이 아니면 버퍼에 저장하여 한꺼번에 받는 방식을 많이 사용한다.


아래와 같이 코딩한다.


InputStream is = // inputStream 초기화는 상황마다 틀리므로, 초기화됬다 가정한다.


String temp;


BufferedReader buffer = new BufferReader(new InputStreamReader(is,"UTF-8");


while((temp = buffer.readLine() ) != null){


//........


}



윗 코딩 처럼 사용할때, 주의 할점이 readLine()은 개행문자가 포함되어야 내부 blocking이 풀리면서 wihle문이 실행한다는 것이다.


다시 말하자면,


BufferReader의 readLine() 를 쓸때는 inputStream 이 반드시 개행문자가 포함되어야 한다. 자바에서의 개행문자는 "\n" 이지만,


스트림에서의 개행문자는 "\r\n"이 개행문자이다. 


따라서, 보내는쪽의 데이터 뒤에 "\r\n"을 반드시 붙여야한다.


ex ) 


String tempData = "아야어여오유";


Byte[] bytes = (tempData+"\r\n").getBytes();




'Java' 카테고리의 다른 글

JAVA - Casting(캐스팅)  (0) 2016.05.26
JAVA - ArrayList에서 배열로, 배열에서 ArrayList로  (2) 2016.04.25
Java foreach문(향상된 for문)  (0) 2016.03.30
JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

이클립스 폰트 설정하는 방법이다.





이클립스 윗 메뉴를 보면 아래와 같이 구성되어 있다.





아래와 같이 window 탭으로 이동한다.





Preferences탭을 누르면 아래와 같이 프레임이 나타난다.






General 탭에서 Colors nad Fonts 를 클릭한 후 오른쪽 메뉴에서 Basic 폴더 안에 맨아래의 Text Font 메뉴를 클릭한다.


후에 Edit 버튼을 누른다. 아래와 같은 프레임이 나타날 것이다.  마음에 드는 폰트종류나 폰트 크기를 설정해주면 되겠다.









'IDE' 카테고리의 다른 글

[IntelliJ] IDEA DB Client 사용하기  (0) 2019.11.07
[IntelliJ] 인텔리J에 이클립스 Tab 기능 설정하기.  (2) 2018.12.23

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅할 내용은 Toolbar 위젯이다.


Toolbar 위젯이 뭔지 아래의 설명을 보자.


해당 내용은 안드로이드 디벨로퍼 API문서이다.




A standard toolbar for use within application content.

A Toolbar is a generalization of action bars for use within application layouts. While an action bar is traditionally part of an Activity's opaque window decor controlled by the framework, a Toolbar may be placed at any arbitrary level of nesting within a view hierarchy. An application may choose to designate a Toolbar as the action bar for an Activity using the setActionBar() method.



요약하자면, 어플리케이션의 제어를 도와주는 액션바는 스크린의 최상위 뷰인 윈도우 decor에 붙여져 있어 다루기 어렵다.

하지만 toolbar는 어느 뷰에서나 종속관계 상관없이 다채롭게 사용가능하며 actionbar 사용하듯 toolbar를 사용할 수 있다는 내용이다.

머터리얼 디자인이 등장함에 따라 UI의 큰 변화가 있었다. ActionBar를 사용시 구현하기 어려운 경우가 많아 

toolbar란 위젯을 만든거 같다. 자세한 내용을 보고 싶다면 아래의 링크를 참조하길 바란다.

http://developer.android.com/intl/ko/reference/android/widget/Toolbar.html 




해당 위젯은 롤리팝 부터 나온 위젯이기 때문에(API level 21) 만약 하위 os에서 쓰고 싶다면 서포트 라이브러리가 필요하다.


build.gradle에서 dependencies에 아래와 같이 추가해준다.

dependencies {

compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'

}


actionBar 대신에 toolbar를 쓸 것 이므로, 액션바가 없는 테마로 변경해야한다.


values 폴더에 styles.xml 안에다가 해당 테마를 만들어준다.


<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>



Activity에 붙일 레이아웃을 아래와 같이 작성한다. (main_activity.xml)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:theme="@style/AppTheme.NoActionBar">
<android.support.v7.widget.Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
app:titleTextColor="#fff"
android:id="@+id/toolbar"
android:background="@color/colorPrimary"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
</android.support.v7.widget.Toolbar>
</LinearLayout>


레이아웃을 작성후 액티비티의 onCreate 메서드에 아래와 같이 작성한다.


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitleTextColor(Color.WHITE);
}

아래의 이미지는 결과물이다.








포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅 할 내용은 자바의 foreach문(향샹된 for문으로 부르기도 한다.)에 대해 알아볼 것이다.


보통 for문을 사용할땐 아래와 같이 사용한다.


for(int i=0; i<array.size(); i++){

System.out.println(array.get(i));

}


위와 같이 for문은 초기값 ; 조건식 ; 증감식 을 통해서 사용한다.


보통 조건식을 array.size()를 사용함으로써, array의 크기가 바뀌더라도 알아서 적용하게끔 쓴다.


하지만, 조건식에 array.size()를 사용할 시, for문이 돌때마다 size를 호출 한다는 단점이 있다.


데이터가 적을땐 문제가 안되지만, 만약 데이터가 많다고 가정해보면 문제가 될 수 도 있다.


따라서 아래와 같이 사용하기도 한다.


for(int i=0,size = array.size(); i<size; i++){

System.out.println(array.get(i));

}


초기값 세팅에 size를 미리 구해서 for문이 돌때마다 array.size() 메서드의 사용을 피한 것이다.


위의 예시에선 문제가 없지만, 아래와 같은 경우에 또 문제가 생길 수 있다.


for(int i=0,size = array.size(); i<size; i++){

System.out.println(array.get(i));

System.out.println(array.get(i));

}


무엇이 문제가 될 수 있을까? 답은 array.get(i)를 두번 호출 해야하는 상황에서 생길 수 있다.


단순히 원하는건 array.get(i)가 리턴해주는 String 값인데, arrayList를 쓸때없이 두번 접근 하고 있다.


이러한 문제를 해결하기 위해선 보통 아래와 같이 코딩한다.


for(int i=0,size = array.size(); i<size; i++){

String tempValue = array.get(i);

System.out.println(tempValue);

System.out.println(tempValue);

}


위의 예제에서는 String 변수 tempValue에 array.get(i) 값을 미리 저장시켜


array호출을 두번 하지 않고 String Value만을 프린트하게 한다.  이렇게 함으로써 array를 한번만 접근할 수 있다.


지금까지 for문 사용법에 변천사를 쭉 보아왔는데, 이러한 것들을 foreach문 쓰면 편하다.


for(String tempValue : array){

System.out.println(tempValue);

System.out.println(tempValue);

} 


간단하지 않은가! 이렇게만 작성해주면 위에서 말했던 문제점들이 전부 해결된다.


특이한점은 초기값 세팅에 size를 미리 구할때도 size()메서드를 한번은 호출한다.


하지만 foreach문은 size()메서드를 한번도 안부른다는 점이다.


(주관적인 생각은 array를 하나씩 get 하면서 끝까지 index가 끝까지 도달했을때,


끝나게끔 코딩을 한것이 아닌가 생각이든다.)


하지만 위의 예제에서 혹시 index값을 구하고 싶은경우가 있을것이다.


그런경우는 아래와 같이 코딩하면 될것이다.


int index = 0;

for(String tempValue : array){

System.out.println("Index : " + index++);

System.out.println(tempValue);

System.out.println(tempValue);

} 


foreach문은 JDK 5.0 이상부터 지원하는 문법이다.


만약 일반 for문이랑 차이점을 모른다면 잘 안쓸 문법이다.


하지만 위에서 설명한 이유를 읽어보고 잘 이해를 했다면


충분히 써 볼 가치가 있다고 느낄 것이다.






'Java' 카테고리의 다른 글

JAVA - ArrayList에서 배열로, 배열에서 ArrayList로  (2) 2016.04.25
JAVA BufferedReader readLine에 관하여.  (2) 2016.04.09
JAVA Static이란?  (2) 2016.03.29
자바 enum 열거형  (0) 2016.01.27
JAVA - 익명클래스(Anonymous class)란?  (3) 2016.01.20

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅 할 내용은 Static에 대해 알아 볼 것이다.


프로그래밍 용어로써의 Static은 정적의,고정의 뜻으로 생각하면 된다.


자바에서는 어떻게 쓰이나 아래의 설명을 보자.


먼저, 자바는 Statically Type Variable (정적 타입 변수)를 가진다.


예를 들어, 변수를 사용할때 아래와 같이 사용한다.


int a = 1;


int라는 자료형을 미리 정해줌으로써 a 변수는 정수 실제 데이터 밖에 싣지 못한다.


미리 자료형을 고정하므로 Static개념이다.


많은 스크립트 언어가 윗 개념과의 반대인 Dynamically Type Variable(동적 타입 변수)를 가진다.


예를 들어, 자바스크립트에서는 아래와 같이 변수를 사용한다.


var a = 1;


여기서는 var(Variable의 약자) 이라는 변수 표시와 함께 변수명 a를 선언 했을때, 실제데이터의 종류에 따라 동적으로


타입이 결정된다. 윗 예시는 실제데이터가 정수형 이므로 a의 자료형은 정수형이 되는것이다. 



두번째로, 자바는 static 예약어를 제공한다. 윗 개념에서 살펴 보았드시, Static은 정적의 고정의 뜻으로 생각하면 된다. 아래의 예시를 보자.


public class StaticTest{


 static public int a = 1;


 public int b = 3;


 static public void add(){

 }

}


윗 예시는 int 형 변수 a 를 static 예악어를 통해 고정시켜 놓았다. 어딜 고정 시켜 놓은 것 일까?


답은 메모리에 미리 고정시켜 놓은것이다.


클래스 안의 변수를 사용하기 위해서는 인스턴스를 생성해야 한다. 

ex)

 StaticTest st = new StaticTest(); 

 st.a;

 st.add; 

<인스턴스 변수. 변수 or 메서드>


하지만, static 예약어를 사용하면 인스턴스를 생성하기 전에 미리 메모리에 올려놔 고정시킨다.


이렇게 되면 무슨 특징이 있을까? 아래와 같은 특징이 있다.




1. 인스턴스를 생성한 후 이용가능 하던 변수가 static 예약어를 사용함으로써, 미리 메모리에 올라가 있으므로, 인스턴스 생성 없이 바로 사용가능하다.


  StaticTest.a; 

  StaticTest.add();  

<클래스.변수 or 메서드>


2. StaticTest 의 인스턴스를 몇개를 생성하든 a의 변수는 이미 메모리에 올라가 있으므로,

  

  인스턴스 마다 변수 a가 생기는 것이 아니라 메모리에 미리 올라가 있던 변수 a를 공유한다. 


  따라서 static 예약어를 사용한 변수는 공유변수 라고도 불린다.


  변수a를 공유하므로 변수a크기 만큼 메모리를 아낄 수 도 있다. 


  메서드도 똑같이 생각하면 된다.


3. 만약 변수b를 static 메서드 add안에다가 사용하면 오류가 발생한다. 

  

  이유는 int b는 StaticTest의 인스턴스가 생성되어야 쓸수 있는 멤버변수지만,

  

  static public void add()는 인스턴스가 생기길 기다려주지 않고 바로 메모리에 올라가기 때문에 


  StaticTest안에 일반 멤버변수 b는 쓰지 못한다.



여기까지가 준비한 포스팅 내용이다. 프로그래밍 개념으로서의 static은 고정하다, 정적이다. 라는 뜻이므로


자바 뿐만 아니라 static 개념이 나오는 모든 프로그래밍을 윗 개념으로 이해하면 좋을 것 이다.





'Java' 카테고리의 다른 글

JAVA BufferedReader readLine에 관하여.  (2) 2016.04.09
Java foreach문(향상된 for문)  (0) 2016.03.30
자바 enum 열거형  (0) 2016.01.27
JAVA - 익명클래스(Anonymous class)란?  (3) 2016.01.20
JAVA의 삼항연산자  (4) 2015.12.11

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

원하는 기능 또는 버그 등 개선할 점을 


댓글로 달아주세요!


포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts