안드로이드

반응형




안드로이드에서 레이아웃이나 버튼 이미지 뷰 등등 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값으로 넣어주었더니

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




반응형
반응형


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

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


                         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();

		 }





반응형
반응형

뭔가 특별한게 있을 줄 알았는데 별 거 없었다..


그냥 텍스트 뷰에서 하는 것 처럼 xml 에서


<EditText

android:text="텍스트"

/>


이렇게 해주면 입력칸에 hint가 아닌 진짜 텍스트가 초기상태부터 들어가 있다.




반응형
반응형



이미지를 캡쳐하는 어플을 만들었는데 저장하기 버튼을 누르면 캡쳐가 되는 기능이었다.


그런데 저장하기를 누르니까


java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
at android.graphics.Bitmap.createBitmap(Bitmap.java:585)
at com.project.app.ResultActivity.onClick(ResultActivity.java:860)

at android.view.View.performClick(View.java:3531)
at android.view.View$PerformClick.run(View.java:14125)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4449)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
at dalvik.system.NativeStart.main(Native Method)


이런 에러가 나타났다. 그래서 해결책을 찾고 있었는데 다 recycle()이거나 BitmapFactory등등 뭔가 복잡했다.

내 실력으로는 잘 이해가 안갔다.

그러다 되게 간단해 보이는 방법을 찾았는데

AndroidManifest.xml 파일에


<application>

....

android:largeHeap="true"

....

</application>


어플리케이션 부분에 이 옵션을 주는 것이었다.  어플리케이션에 메모리할당을 더 크게 늘려주는 옵션이라나... 

아무튼 적용해보니 에러가 발생하지 않았다.

감격 ㅠㅠ

물론 이게 100%해결책은 아니지만 가장 간단한 해결책이 되지 않을까 싶다.




반응형

+ Recent posts