XML



Android Studio 에서 서명된 apk를 생성하려고 했더니 이런 에러가 떴다.


Error:(24) Error: "none" is not translated in "en" [MissingTranslation]

(*어느 언어냐에 따라 "en" "vi" "th" 등등 다르게 나타남)


보니까 다국어에서 문제가 생겼는데 프로젝트는 이클립스에서는 문제가 없었던 거였다.



그래서 찾아보니 안드로이드 스튜디오에서는 string.xml 이 모두 같아야 한다고 한다.


즉 위 에러를 보면


<string name="none">none</string>


이 코드가 "vi"에서 번역되지 않았다고 뜬다. 베트남어에서 none 항목이 없다는 것이다.


현재 다국어 구조가



이렇게 한국,영어,대만,베트남 4개로 되어있는데


베트남의 string.xml 에만


<string name="none">none</string>


이 항목이 번역되지 않았다는 것이다.



이 문제를 해결하려면


values-vi 의 strings.xml 로 들어가


<string name="none">none</string>


이걸 추가해준 뒤 다시 서명된 apk를 생성하면 해결된다.






xml 작성 중 error: Apostrophe not preceded by / 계속 이런 에러가 났다 


왜 그런고 하니 어퍼스트로피 이 원인이었다.


본문은


creates a profile to share a friend's sending 


이러하였고 그래서 어퍼스트로피 전에 역슬래시를 추가해주었다.


creates a profile to share a friend\'s sending 


문제가 해결되었다!





안드로이드 팝업창 띄우기


일단 팝업창 띄우기 예제는 많기는 한데 용도가 경고하거나 알림용이다


나는 그런 용도보다는 설명용이라 아예 xml파일을 팝업창에 보여주고 싶었다.


우선 팝업창을 만드는 작업이 필요하다.





일단 팝업창 띄우기 위한 버튼


버튼을 만들 xml파일에 만들어준다.

ex)hidden.xml



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/alert"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="히든설명" />
  
</LinearLayout>



이제 액티비티 설정부분

버튼 만든 해당 액티비티에 만들어준다.


ex)HiddenActivity.java



import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MessageDemo extends Activity implements View.OnClickListener{
	Button alert; //팝업버튼선언

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		//팝업버튼 설정
		alert=(Button)findViewById(R.id.alert);//R.id.alert는 팝업버튼 아이디
		alert.setOnClickListener(this);
		
	}
	public void onClick(View view){
		if(view==alert){ //view가 alert 이면 팝업실행 즉 버튼을 누르면 팝업창이 뜨는 조건
			new AlertDialog.Builder(this)
			.setTitle("히든목록") //팝업창 타이틀바
			.setMessage("FinessShot")  //팝업창 내용
			.setNeutralButton("닫기",new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dlg, int sumthin) {
					//닫기 버튼을 누르면 아무것도 안하고 닫기 때문에 그냥 비움

				}
			})
			.show(); // 팝업창 보여줌
		}
		
	}
}





여기까지 해주면 히든설명 이라는 버튼을 누르면 팝업창이 뜨게된다.



하지만 팝업창에서 보여줄 내용이 많을때 이렇게 하면 내용이 짤리고 공간이 부족했다.



그래서 이제부터 xml파일을 하나 만들고 그 내용들을 팝업창에 보여주도록 할 것이다.


우선 팝업창에 보여줄 xml파일을 따로 만든다


ex) dialog.xml


내용이 길어서 스크롤뷰를 적용하였다.

23번째 줄 android:text= "여기에 표시해줄 내용을 쓴다"




<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/popup" <!-- 아이디 선언, 액티비티에서 필요함-->
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#191A19"
    android:orientation="vertical"
    tools:context=".HiddenActivity" > <!--해당 액티비티 선언-->    
     <LinearLayout
       
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
   
       
    <TextView
       
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textColor="#B4B4B4"
       android:layout_gravity="center"
       android:textSize="15sp"
       android:text=" -Argues With Officials : 애매한 판정일 경우 심판과 언쟁을 함\n\n -Avoids Using Weaker Foot : 약한발은 잘 사용하지 않음\n\n -Cautious With Crosses : 코너킥 및 크로스에 대해 인터셉트 시도 보단 골 라인을 지키려 한다\n\n -Comes For Crosses : 코너킥 및 크로스에 대해 적극적으로 인터셉트를 시도한다\n\n -Corner Specialist : 코너킥 시 좀더 많은 골 찬스를 발생시킴 \n\n -Counter Attacker : 역습상황으로 전환할때의 반응속도가 향상됨\n\n -Diver : 태클을 당하면 넘어지면서 반칙을 유도함\n\n -Dives Into Tackles : 슬라이딩 태클을 자주 시도함\n\n -Early Crosser : 얼리크로스 능력치 뛰어남\n\n -Fancy Feet : 보다 정교하고 화려한 퍼스트 터치 발동\n\n -Finesse Header : 정확한 헤딩을 시도함\n\n -Finesse Shot : 정확한 슛팅을 시도함\n\n -Flair : 공을 받거나 받은 후에 일정한 공간과 시간이 있다면 자발적으로 트릭을 사용함\n\n -Forward pushes wide left : 공격시 왼쪽을 선호하는 움직임\n\n -Forward pushes wide Right : 공격시 오른쪽을 선호하는 움직임\n\n -Giant Thorw in : 드로잉을 아주 멀리 던짐 \n\n -GK Long Throw : 골킥을 멀리 찰 수 있음\n\n -GK One On One : 1:1상황에서의 방어능력이 뛰어남\n\n -GK Puncher : 펀칭의 능력이 뛰어나고 자주시도함\n\n -GK up for Corners : 키퍼가 경기종료시간이 얼마 안남았을때 코너킥 상황에 공격하러 올라감\n\n -Heel Passer : 힐패스능력이 뛰어남\n\n -High Determination : 지고있는 상황에서 일관성 상향\n\n -Holds Up : 공격상황에서 몸싸움 경합시 밸런스 상향..."
       android:textStyle="bold"
       android:typeface="normal" />
    </LinearLayout>

    
    </ScrollView>




이제 액티비티에 코드를 수정하자


HiddenActivity.java 파일로 돌아가서 onClick 함수에서 선언한 부분을 수정한다.





public void onClick(View view){
		if(view==alert){ //view가 alert 이면 팝업실행 즉 버튼을 누르면 팝업창이 뜨는 조건
			Context mContext = getApplicationContext();
			LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);

			//R.layout.dialog는 xml 파일명이고  R.id.popup은 보여줄 레이아웃 아이디
			View layout = inflater.inflate(R.layout.dialog,(ViewGroup) findViewById(R.id.popup));
			AlertDialog.Builder aDialog = new AlertDialog.Builder(CustomActivity.this);
		
			aDialog.setTitle("히든스탯 목록"); //타이틀바 제목
			aDialog.setView(layout); //dialog.xml 파일을 뷰로 셋팅
		
			//그냥 닫기버튼을 위한 부분
			aDialog.setNegativeButton("닫기", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
			}
		});
		//팝업창 생성
		AlertDialog ad = aDialog.create();
		ad.show();//보여줌!
	}




이렇게 해준 뒤 실행해보면





이런 식으로 스크롤 뷰로 팝업창에 나타난다. 

한마디로 팝업창안에 xml 파일내용이 들어가서 보여준다.



  1. sss 2014.03.23 15:30

    뒤로가기 눌러서 없어지지 않게하려면 어떻게하나요

    • yonoo88 2014.03.23 16:21 신고

      뒤로가기 버튼으로 팝업창을 안 없어지게 말씀이신가요?

      뒤로가기 버튼은 거의 고정적인 버튼이라 그 부분은 저도 잘 모르겠네요

  2. 이재승 2014.09.20 19:12

    감사합니다~~~ 잘 쓸게요 ㅎㅎㅎ

  3. 이재승 2014.10.28 15:43

    하나만 더 여쭤봐도 될까요? 한 화면에 버튼 2개를 만들어서 각각 다른 팝업 창 띄우려면 액티비티를 어떻게 수정해줘야 하나요??

    • yonoo88 2014.10.28 21:06 신고

      우선 버튼 하나를 더 만드세요 alert2 이런식으로 만드시고
      다른 팝업창에 띄울 xml 파일도 하나 만드시구요.

      onClick 메소드 안에 if 문 보이시죠? 거기에 view==alert 이게 alert 버튼을 눌렀을 때 수행되는 코드인데요.

      if문을 alert2 를 사용해서 하나더 만드는거죠.
      else if(view==alert2) { ... }
      이런 식으로 다른 팝업창 띄울 코드를 안에 써주면 되실거에요

  4. 이재승 2014.10.29 10:14

    오오오 적용되네요 ㅎㅎㅎ 정말정말 감사합니다 ㅎㅎㅎㅎ

  5. 이동우 2015.02.05 21:14

    맨 밑에 CustomActivity.this 부분이랑
    aDialog.setView(layout) 이 두부분이 빨간줄이뜨네요 ㅠㅠ

    • yonoo88 2015.02.06 10:07 신고

      빨간줄에 마우스 갖다대면 뭐라고 뜨나요?

    • 우너장 2015.03.19 14:45

      그냥 this만 쓰면 되요

  6. ssddff521 2016.01.30 10:54

    Error:Execution failed for task ':app:processDebugResources'.
    > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'F:\SDK\build-tools\23.0.2\aapt.exe'' finished with non-zero exit value 1
    이라는 에러가 듭니다.

    • yonoo88 2016.01.30 10:55 신고

      첨보는 에러인데 이건 코드상 문제라기보다 뭔가 이클립스 셋팅에러인거 같습니다. 경로가 sdk 쪽인데 한번 찾아보시면 될 것 같습니다

  7. 라노스 2016.06.01 17:36

    AlertDialog ad = aDialog.create();
    ad.show();//보여줌!

    ad.show에서 show가 없다는 오류가 뜨는데 왜그런 걸까요?

    • yonoo88 2016.06.01 17:39 신고

      혹시
      import android.app.AlertDialog;

      이게 임포트 되어있으신가요?

  8. 우엥 2017.05.30 19:03

    xml 내용을 띄우고 xml에 버튼이 있을 경우 버튼 클릭시 이벤트 처리를 또 하고 싶은데 방법이 있나요?

    • yonoo88 2017.06.03 03:20 신고

      이 글 예시로 보면 hiddenactivity에 버튼을 구현하고 이벤트 처리하시면 될겁니다.

  9. guppy 2018.10.05 14:58

    안녕하세요
    일회성 팝업창을 만들고 싶은데 혹시 어떻게 해야할지 알려주실수 있으신가요?




안드로이드에서 레이아웃이나 버튼 이미지 뷰 등등 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" 


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



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



+ Recent posts