스마트기기개발관련/안드로이드 개발

안드로이드 해상도 상관없이 나만의 대화상자 만들기

AlrepondTech 2020. 9. 19. 02:37
반응형

 

 

=================================

=================================

=================================

 

 


출처: http://blog.naver.com/baram918?Redirect=Log&logNo=120133707446

 

팝업 윈도우

 

팝업윈도우는 사용자가 직접만드는 대화상자라고 생각하면 좋을 것 같습니다.

 

인플레이션을 쓰므로 따로 xml을 만들어야겠죠?

 

그리고 코드에서 대화상자의 width와 height를 줄 때 이상하게 뭔가 썼는데 그것은 아래 주석

 

을 읽어 보시면 될 것 같습니다.

 

그리고 주석을 하나씩 풀어가면서 위치가 어떻게 변하는지 보는 것도 좋을 것 같습니다.

 

main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

       android:id="@+id/linear"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:gravity="center"

    >

<Button

    android:id="@+id/btnshow" 

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="Show Popup"

    />

</LinearLayout>

 

 

popupview.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:background="#ffffff"

    >

<EditText

    android:layout_width="150px"

    android:layout_height="wrap_content"

    />

<Button

       android:id="@+id/btnclose"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="Close Popup"

    />

</LinearLayout>

 

 

package com.android.ex74;

import android.app.Activity;

import android.content.res.Resources;

import android.os.Bundle;

import android.util.DisplayMetrics;

import android.util.TypedValue;

import android.view.Gravity;

import android.view.View;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.PopupWindow;

public class ex74 extends Activity {

    PopupWindow popup;

    View popupview;

    LinearLayout linear;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        //아래부분를 왜 하면 만약 popup = new PopupWindow(popupview,200,100,true);

        //에서 width와 height를 하드코딩하면 에뮬에서는 잘돌아가겠지만

        //기종마다 다르게 화면이 나올수도있다. 이유는 기종마다 lcd 밀도와 해상도가 다르기때문인데

        //이부분을 기종마다 각각의 자원들을 가져와서 계산을 해주는 부분이다.   

        Resources res = getResources();

        DisplayMetrics dm = res.getDisplayMetrics();

        int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, dm);

        int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, dm);

        linear = (LinearLayout) findViewById(R.id.linear);

        popupview = View.inflate(this, R.layout.popupview, null);

        //popup = new PopupWindow(popupview,200,100,true);

        popup = new PopupWindow(popupview, width, height, true);

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

        btnshow.setOnClickListener(new Button.OnClickListener() {

            public void onClick(View v) {

                // 지정한 좌표에 놓기

                // popup.showAtLocation(linear,Gravity.NO_GRAVITY,50,100);//x=50 y=100

                // 가운데 놓기

                //popup.showAtLocation(linear,Gravity.CENTER,0,0);

                // 가운데 + 50, 80에 놓기 x로는 +가 되지만 y로는 -가 됨 즉 80정도 위로 올라감

                popup.showAtLocation(linear, Gravity.CENTER, 50, 80);

                // 화면 벗어나기

                //popup.showAtLocation(linear,Gravity.NO_GRAVITY,800,1200);

                // 수평 중앙, 수직 바닥

                //popup.showAtLocation(linear,Gravity.CENTER_HORIZONTAL|

                //     Gravity.BOTTOM,0,0);

                // 수평 중앙, 수직 바닥 + (50,50)

                //popup.showAtLocation(linear,Gravity.CENTER_HORIZONTAL|

                //     Gravity.BOTTOM,50,50);

                // 버튼 아래에 놓기 드롭다운 형태로 팝업을 하고 애니메이션 스타일을 -1으로 즉 디폴트로 지정함

                //popup.setAnimationStyle(-1);  

                //popup.showAsDropDown(btnshow);

            }

        });

        Button btnclose = (Button) popupview.findViewById(R.id.btnclose);

        btnclose.setOnClickListener(new Button.OnClickListener() {

            public void onClick(View v) {

                popup.dismiss(); //이 부분은 팝업을 닫는 부분

            }

        });

    }

}

 

 

 

 

 

 

 

반응형

 

728x90

 

 

=================================

=================================

=================================

 

 

해상도 UI 구성 조언

출처: http://www.androidpub.com/1121432

갤스는 context.getResources().getDisplayMetrics.density 가 1.5 가 나옵니다. 320 비율로 봤을 떄 480 이니깐 
당연한 거죠..

그런데 갤탭도 1.5 가 나옵니다. 계산되로 라면 1.875 정도가 나와야 하는게 맞거든요.

그러니깐 갤탭에서 UI가 이상하게 나오는 겁니다. ㅠㅠ

dip 로 넣어준것들도 다 이상하게 나오구여.

왜그런거죠. 제가 뭘 잘못한 건가요 ㅠㅠ

이 게시물을...

 

목록

엮인글 주소 : http://www.androidpub.com/index.php?document_srl=1121432&act=trackback&key=785

 

2010.12.16 21:09:24

커니

버그가 아닙니다. 1,5가 맞으며, 대신 탭은 가로 화면크기가 320dip 이 아니라 400dip입니다.

 

dip을 사용했더라도 가로 크기가 320dp일 떄를 가정하고 그에 맞춰 작성했다면 당연히 레이아웃이 깨지죠.

dp를 올바르게 사용했다면 화면 크기에 맞게 자동으로 스케일되어 정상적으로 표시됩니다.

 

2010.12.16 21:23:56

그냥가자

커니님의 말씀에는 약간의 잘못된 점이 있습니다.
dp를 올바로 사용하는 것이 fill_parent , wrap_content의 사용까지 포함하는건가요?
dp를 320으로 맞출수도 없고 400으로 맞출수도 없다면 dp를 잘못 썼다는 말을 할수는 없는겁니다.

어떤 단위로 쓰던간에 수치로만 레이아웃을 구성한다면 깨질수 밖에 없습니다.
적절한 곳에 fill_parent, wrap_content를 써야 하는것이 항상 전제되어야 하는거죠...

 

2010.12.16 22:44:31

커니

정확히 어떤것을 말씀하시는지 모르겠네요.

기본적으로 dp나 sp를 사용하는것은 맞지만, 가로 화면 크기가 320dip이라 가정하고 사이즈를 그 크기에 맞추면 dp를 쓰는 이유가 없습니다.

현재 탭에서 해상도 문제가 발생하는 대부분의 앱이 위의 문제를 가지고 있습니다.

 

즉, dip을 쓰면서 320diip에 맞춘다, 400dip에 맞춘다 하는 것 자체가 이미 dip이라는 수치를 쓰는 의미를 잃게 만드는것이죠.

 

그리고... wrap_content나 match_parent (혹은 fill_parent)를 병행하여 레이아웃을 구성하는 것은 기본 중의 기본입니다.

문제는 이러한 사항조차 무시하고 그냥 가로 크기를 320dp으로 고정하기에 문제가 발생하는것이지요.

 

즉... dp를 올바르게 사용한다는 말의 의미는 dp를 써야 하는 곳에 쓰고, 다른 것을 사용해야 하는 곳에는 다른 것들을 사용한다는 것을 모두 포함합니다.

 

2010.12.17 10:52:32

 

그냥가자

아... 물론 그런건 저는 알고 있습니다. 이의 제기를 한거는 뭐랄까 일부러입니다.

'dp를 올바로 사용한다'는 말은 좁게 보면 'dp를 단위로 쓰다'는 것으로 한정될 수 있습니다.
아는사람들이야 커니님 말씀대로 이겠지만 말이죠...

'dp를 쓰면 된다'는 포인트가 문맥이 다 빠진채 저 말만 남아서 여기저기 돌아다니는게
현재 저런 질문이 계속해서 올라오고 문제를 해결하지 못하는 사람이 나오는 이유겠죠...

모든 설명을 누구나 알아들을수 있게 해야하는 의무같은건 없지만
어쩌다 한번씩은 똑같은 설명이 아닌 좀더 알아듣기 좋은 설명이 필요하지 않을까 해서요....
dp를 잘쓰면 된다는 말을 되풀이하는 이상 이런 질문은 계속나오고 답변도 계속 똑같이 되풀이될겁니다.
의미가 없는 답변이겠죠... 차라리 무플이 낫죠....

 

2010.12.16 22:13:31

엠씨

저도 갤탭화면 이상하게 나오길래 UI화면 작업 거의 다시했어요...ㅠ.ㅠ;

그냥가자님의 말씀이 옳습니다.

수치로만 레이아웃을 구성하면 나중에 크게 후회하십니다..ㅎㅎ

fill_parent, wrap_content 과 layout_weight 조절하여 화면 구성하면 이상없이 나오길꺼에요..

또한 AndroidManifest파일의 minSdkVersion 값 설정 안해도 이상하게 보일때가 있더군요..;

 

 

 

=================================

=================================

=================================

 

 

반응형