지식메모/안드로이드 Android

반응형

Oncreate() 부분에 


createThreadAndDialog(); 


추가해주고


밑의 소스를 추가해주면 된다.



private ProgressDialog loagindDialog; // 로딩화면 void createThreadAndDialog() { /* ProgressDialog */ loagindDialog = ProgressDialog.show(this, "다이얼로그 명", "Loading.....", true, false); Thread thread = new Thread(new Runnable() { private static final int LOADING_TIME = 2000; @Override public void run() { // 시간걸리는 처리 handler.sendEmptyMessageDelayed(0, LOADING_TIME); } }); thread.start(); } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { loagindDialog.dismiss(); // 다이얼로그 삭제 // View갱신 } };


반응형
반응형


soundpool을 이용한 간단한 소리나 효과음 재생하는 방법 링크

↓↓↓↓↓↓

http://itgury.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-SoundPool-%EA%B0%84%EB%8B%A8-%EC%82%AC%EC%9A%A9-%EC%98%88%EC%A0%9C%EC%86%8C%EB%A6%AC%EC%95%8C%EB%A6%BC%EC%9D%8Craw#tb



그런데 이거대로 했는데 소리가 안났다.


검색을 해보니 나와 같은 증상을 겪은 사람들이 올린 글의 댓글에 해결책을 찾았다.

여기에 해결책이 있었다.

↓↓↓↓↓↓

http://www.androidpub.com/1228909




천상룡섬님과 커널제로님의 해결책이었는데


원인은 


"해당 문제는 말 그대로 sound pool이 음원 재생 전 load 단계에서 준비가 되지 않아 발생한 문제입니다."


라고 한다.


그래서 커널제로님이 그 해결코드를 올려주셨는데 load가 될때까지 sleep으로 시간을 주었다.

해보니까 소리가 났다!!


이런 분들 정말 좋으신 분들이다.

복 받으시길..대박




반응형
반응형




안드로이드에서 레이아웃이나 버튼 이미지 뷰 등등 xml에서 제어 가능한 부분을 조건에 따라 보여주고 숨길 수 있는 방법이 있었다.




layout.setVisibility(View.VISIBLE);

해당 뷰를 보여줌


layout.setVisibility(View.INVISIBLE);

해당 뷰를 안 보여줌(공간은 존재)


layout.setVisibility(View.GONE);

해당 뷰를 안 보여줌(공간마저 감춤)




INVISIBLE과 GONE의 차이는 공간을 보여주느냐 안 보여주느냐의 차이이다.




예를 들면 1 2 3 4 5 의 숫자가 있을때 3을 숨기려고 한다면


INVISIBLE은 1 2 " " 4  5 이런 식으로 3은 없지만 자리는 남아있고


GONE은 1 2 4 5 이런 식으로 3과 공간 모두 숨기게 된다.




사용 예로



LinearLayout layout = (LinearLayout) findViewById(R.id.first);
LinearLayout layout2 = (LinearLayout) findViewById(R.id.second);
LinearLayout layout3 = (LinearLayout) findViewById(R.id.third);

switch (checkedId) {

case R.id.button:

	
	layout.setVisibility(View.VISIBLE);
	layout2.setVisibility(View.INVISIBLE);
	layout3.setVisibility(View.GONE);



이렇게 사용하면 id가 button 인 버튼을 누르면 

id가 first인 레이아웃은 보여지고

second 레이아웃은 보이지 않고 그냥 빈 공간만 나오게 되며

third 레이아웃은 아예 삭제된듯이 숨겨지게 된다.




그리고 버튼을 선택하기전에 초기상태에서 숨기려면 직접 xml 파일로 가서 해당 레이아웃에


android:visibility="gone" 


옵션을 주면 처음부터 보여지지 않게 된다.



레이아웃 뿐만 아니라 버튼이나 이미지 뷰 텍스트 뷰 등등 여러가지도 적용할 수 있다.



반응형
반응형



안드로이드 EditText 에디트텍스트 값 남겨두기



다음 액티비티로 넘어갔다가 다시 전 액티비티로 돌아올 때 입력했던 EditText 값을 그대로 놔두고 싶다면

intent 호출 부분에



Intent intent = new Intent(this, SecondActivity.class);

startActivity(intent);

finish();


 finish(); 이걸 지워주면 된다.

액티비티 종료 코드를 없애주면 되는 것이다.

난 예제만 보고 따라하느라 그냥 썼다가 값이 안 남길래 삽질을 했었다.

알고보니 간단한 거였다.. 





반응형
반응형



스피너를 이용하여 값을 전달한 후 값에 따른 이미지를 출력하였다.

string.xml에 스피너에 쓰일 목록을 만들어둔다.



<string name="season">시즌</string>
    
    <string name="season_prompt">시즌 선택</string>
    <string-array name="season_array">
        <item>봄</item>
        <item>여름</item>
        <item>가을</item>
        <item>겨울</item>
    </string-array>



그 다음 send.xml



 <Spinner 
         android:id="@+id/spinner_season" <!--스피너 아이디-->
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:prompt="@string/season_prompt"<!-- string.xml에서 작성한 목록 -->
         android:layout_marginRight="10dp"
          />




이렇게 스피너를 만들어준다.



그리고 SendActivity.java 에서 스피너 값을  보내주자 OnCreate 부분에


Spinner spinner = (Spinner)findViewById(R.id.spinner_season);//send.xml의 스피너 아이디
		
		ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.season_array,
				android.R.layout.simple_spinner_item);
		
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spinner.setAdapter(adapter);



이렇게 스피너를 선언해주고 Onclick메소드에 스피너 값을 인텐트에 태워 보낸다.


String str_season = spinner.getSelectedItem().toString();	
	 	
 Intent it3 = new Intent(this,ReceiveActivity.class);
			 
	 
			 
 it3.putExtra("it3_season", str_season);	//it3_season 이라는 스트링으로 str_season 값을 넘긴다.	 
 
startActivity(it3);





이제 스피너 값에 따른 이미지를 출력하기 위해 receive.xml 에

이미지 뷰를 만들었다


  <ImageView
       android:id="@+id/season_year"
       		
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"     
                      
       />




이제 ReceiveActivity.java 에서 받아보자.

마찬가지로 OnCreate 부분에



Intent it3=getIntent();		//인텐트를 받아오고
		
		String str_season= it3.getStringExtra("it3_season"); //it3_season으로 보내온 값을 str_season에 저장
		
		ImageView season = (ImageView)findViewById(R.id.season_year); //사진을 출력할 이미지뷰
		if(str_season.equals("봄")){ //str_season 값이 봄이라면
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.spring); //봄 사진 가져와서
			season.setImageDrawable(img_season);//봄 사진 출력
		}else if(str_season.equals("여름")){
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.summer);
			season.setImageDrawable(img_season);
		}else if(str_season.equals("겨울")){
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.autumn);
			season.setImageDrawable(img_season);
		}else if(str_season.equals("가을")){
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.winter);
			season.setImageDrawable(img_season);
		}



여기서 애를 먹었던게 if 값을 그냥 평소 하던대로

if(str_season == "봄") 이런식으로 해줬는데 안되서 찾아보니까 String 값은

str_season.equals("봄")  

이런식으로 해줘야 했다.


이제 스피너로 봄 값이 넘어오면 이미지뷰에 봄 사진을 넣어주고 여름이면 여름사진을 보여준다.

아 소스코드 태그 은근 귀찮네..



반응형
반응형

기준값

Low density = 120, ldpi

Medium density = 160, mdpi 

High density = 240, hdpi


 (px -> dip) dip 값 구하기

(dip -> px)  px 값 구하기

 dip = px * (160/기준값)

(hdpi 기준) dip = ( PX / 3 ) * 2

(hdpi 기준) dip = px * 0.666

pixels = dip * (기준값/ 160)

(hdpi 기준) px = dip * 1.5


이미지를 레이아웃 백그라운드에 넣어줬더니 폰마다 다른 해상도 때문에 테스트 폰보다 큰 폰에서는 이미지가 늘어나는 현상이 발생했다.

그래서 레이아웃크기를 wrap_content로 해준 걸 수치로 고정시켜주었다.

그런데 xml에서는 크기수치를 dp로 주게 되어있는데 나는 dp가 픽셀이랑 같은 수치인 줄 알았다.

테스트 해보니 그게 아니었다.


그래서 변환 공식을 찾았고 계산을 해서 직접 때려넣었다.

 물론 소스 상에 변환 코드를 넣어서 구현할 수도 있지만 귀찮기도 하고 실력부족으로...

(기준 값은 hdpi=240으로 잡고 계산했다.)

이미지 사이즈는 픽셀기준이라 그 수치를 공식에 대입해서 나온 결과 값을 레이아웃 dp값으로 넣어주었더니

어느 폰에서나 똑같은 크기로 나올 수 있었다.




반응형
반응형


만약 액티비티를

public class MainActivity extends Activity implements OnClickListener{

이렇게 implements OnClickListener로 선언했다면

onClick 메소드에 xml에서 선언한 버튼의 아이디를 적어주면 된다.

if , else if 로 각 버튼이 눌렸을때 수행할 기능을 넣어준다.


public void onClick(View v){

if(v.getId() == R.id.버튼의 아이디){

... 수행할 기능

}else if(v.getid()== R.id.버튼의 아이디){

..... 수행할 기능

}

소스양식버전


public void onClick(View v){

		if(v.getId() == R.id.버튼의 아이디){

... 수행할 기능

}else if(v.getid()== R.id.버튼의 아이디){

..... 수행할 기능

}



또는 

public class MainActivity extends Activity

그냥 이렇게 선언했다면

OnCreate 부분에서 버튼 별로 수행할 기능을 넣어줘도 된다.

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);


Button btn1 = (Button) findViewById(R.id.버튼1의 아이디);

btn1.setOnClickListener(new OnClickListener() {


public void onClick(View v) {

// 수행할 기능소스

}

});


Button btn2 = (Button) findViewById(R.id.버튼2의 아이디);

btn2.setOnClickListener(new OnClickListener() {


public void onClick(View v) {

// 수행할 기능소스

}

});


}

소스양식버전


public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);


Button btn1 = (Button) findViewById(R.id.버튼1의 아이디);

btn1.setOnClickListener(new OnClickListener() {



	public void onClick(View v) {

//	수행할 기능소스

	}

});


Button btn2 = (Button) findViewById(R.id.버튼2의 아이디);

btn2.setOnClickListener(new OnClickListener() {



	public void onClick(View v) {

//	수행할 기능소스

	}

});



}







반응형
반응형


이미지를 캡쳐해서 저장한 후 공유하기를 통해 이미지를 공유하고 싶었다.

이 공유하기 기능을 사용하면 카톡 페북 미투데이 등등 메뉴가 저절로 나온다.신기방기


                         Intent intentSend  = new Intent(Intent.ACTION_SEND);

 intentSend.setType("image/*");

 intentSend.putExtra(Intent.EXTRA_STREAM, Uri.parse(파일경로));

 startActivity(Intent.createChooser(intentSend, "공유"));

특정파일을 공유하기 위해 다음과 같이 사용했다.

공유하기 버튼을 만들어 그 안에 집어넣었다.

Intent it3=getIntent(); //파일명을 가져오기 위한 인텐트(에디트텍스트에서 이름입력받은 걸 파일명으로 쓰기 위해)

String str_name=it3.getStringExtra("it3_name"); //이름을 가져온다.

File fileRoute = null;

fileRoute = Environment.getExternalStorageDirectory(); //sdcard 파일경로 선언

        File files = new File(fileRoute,"/temp/"+str_name+"-.jpeg"); //temp폴더에 이름으로 저장된 jpeg파일 경로 선언

    

if(files.exists()==true)  //파일유무확인

{

Intent intentSend  = new Intent(Intent.ACTION_SEND);

intentSend.setType("image/*");


//이름으로 저장된 파일의 경로를 넣어서 공유하기

intentSend.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileRoute+"/temp/"+str_name+"-.jpeg"));


startActivity(Intent.createChooser(intentSend, "공유")); //공유하기 창 띄우기

}else{

//파일이 없다면 저장을 해달라는 토스트메세지를 띄운다.

Toast.makeText(getApplicationContext(), "저장을 먼저 해주세요", Toast.LENGTH_LONG).show();

}


소스양식버전


Intent it3=getIntent();	//파일명을 가져오기 위한 인텐트(에디트텍스트에서 이름입력받은 걸 파일명으로 쓰기 위해)

	String str_name=it3.getStringExtra("it3_name");	//이름을 가져온다.	

	File fileRoute = null;

	fileRoute = Environment.getExternalStorageDirectory(); //sdcard 파일경로 선언

			

        File files = new File(fileRoute,"/temp/"+str_name+"-.jpeg"); //temp폴더에 이름으로 저장된 jpeg파일 경로 선언

		     

	 if(files.exists()==true)  //파일유무확인

	 {

			 Intent intentSend  = new Intent(Intent.ACTION_SEND);

			 intentSend.setType("image/*");



//이름으로 저장된 파일의 경로를 넣어서 공유하기

			 intentSend.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileRoute+"/temp/"+str_name+"-.jpeg"));



			 startActivity(Intent.createChooser(intentSend, "공유")); //공유하기 창 띄우기

		 }else{

//파일이 없다면 저장을 해달라는 토스트메세지를 띄운다.

			 Toast.makeText(getApplicationContext(), "저장을 먼저 해주세요", Toast.LENGTH_LONG).show();

		 }





반응형

+ Recent posts