본문 바로가기
computing

20251127-android13, 그래픽, Empty Views Activity menu해결

by greentworkshop 2025. 11. 27.
package com.example.android1127;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    final static int LINE = 1, CIRCLE = 2, RECTANGLE = 3;
    static int curShape = LINE;

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        super.onCreateOptionsMenu(menu);
        menu.add(0,1,0,"선 그리기");
        menu.add(0,2,0,"원 그리기");
        menu.add(0,3,0,"사각형 그리기");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case 1:
                curShape = LINE;
                return true;
            case 2:
                curShape = CIRCLE;
                return true;
            case 3:
                curShape = RECTANGLE;
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyGraphicView(this));
        setTitle("my 그림판");
    }

    // ⭐ 저장할 도형 클래스
    private static class Shape {
        int type, startX, startY, stopX, stopY;
        Shape(int type, int sx, int sy, int ex, int ey){
            this.type = type;
            this.startX = sx;
            this.startY = sy;
            this.stopX = ex;
            this.stopY = ey;
        }
    }

    private class MyGraphicView extends View {

        int startX = -1, startY = -1, stopX = -1, stopY = -1;

        // ⭐ 도형 저장 리스트
        ArrayList<Shape> shapeList = new ArrayList<>();

        public MyGraphicView(Context context) {
            super(context);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event){
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    startX = (int)event.getX();
                    startY = (int)event.getY();
                    break;

                case MotionEvent.ACTION_MOVE:
                    stopX = (int)event.getX();
                    stopY = (int)event.getY();
                    invalidate();
                    break;

                case MotionEvent.ACTION_UP:
                    stopX = (int)event.getX();
                    stopY = (int)event.getY();

                    // ⭐ 사용자가 손을 떼면 도형 저장
                    shapeList.add(new Shape(curShape, startX, startY, stopX, stopY));

                    invalidate();
                    break;
            }
            return true;
        }

        @Override
        protected void onDraw(Canvas canvas){
            super.onDraw(canvas);

            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStrokeWidth(5f);
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(Color.RED);

            // ⭐ 이미 그려진 도형들을 모두 다시 그림
            for (Shape s : shapeList){
                drawShape(canvas, paint, s);
            }

            // 아직 손을 떼기 전 드래그 중일 때 보여주는 미리보기
            if (startX >=0 && stopX >= 0){
                Shape temp = new Shape(curShape, startX, startY, stopX, stopY);
                drawShape(canvas, paint, temp);
            }
        }

        // ⭐ 도형 그리는 공통 메서드
        private void drawShape(Canvas canvas, Paint paint, Shape s){
            switch (s.type){
                case LINE:
                    canvas.drawLine(s.startX, s.startY, s.stopX, s.stopY, paint);
                    break;

                case CIRCLE:
                    int radius = (int) Math.sqrt(
                            Math.pow(s.stopX - s.startX, 2) +
                                    Math.pow(s.stopY - s.startY, 2)
                    );
                    canvas.drawCircle(s.startX, s.startY, radius, paint);
                    break;

                case RECTANGLE:
                    canvas.drawRect(
                            Math.min(s.startX, s.stopX),
                            Math.min(s.startY, s.stopY),
                            Math.max(s.startX, s.stopX),
                            Math.max(s.startY, s.stopY),
                            paint
                    );
                    break;
            }
        }
    }
}

 

Empty Activity의 경우 기본으로 설정된 언어가 kt라 java로 작성하고 싶다면

어쩔 수 없이 Empty Views Activity를 활용해 작성해야 한다.

하지만 그럴 경우 메뉴창, 타이틀이 출력되지 않는 문제가 있다.

 

이 문제를 해결하기 위해서는 보통 values -> themes -> themes.xml 파일로 들어가

숨김처리된 메뉴바를 활성화해야한다.

 

 

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Base.Theme.Android1127" parent="Theme.Material3.DayNight.NoActionBar">
        <!-- Customize your light theme here. -->
        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
    </style>

    <style name="Theme.Android1127" parent="Base.Theme.Android1127" />
</resources>

위 코드를 아래코드로 수정하면 해결된다.

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <!-- 'NoActionBar'를 제거하여 Material 3의 기본 Action Bar를 사용하도록 변경합니다. -->
    <style name="Base.Theme.Android1127" parent="Theme.Material3.DayNight">
        <!-- Customize your light theme here. -->
        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
    </style>

    <style name="Theme.Android1127" parent="Base.Theme.Android1127" />
</resources>

check시 button1의 텍스트가 변경

//MainActivity.java

package com.example.a1127_3;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);

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

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final String[] versionArray = {"쫄면", "떡볶이", "김밥"};
                final boolean[] checkArray = {true, false, true};

                AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
                dlg.setTitle("제목");
                dlg.setIcon(R.mipmap.ic_launcher);

                // ★ 다중 선택은 setMultiChoiceItems 사용
                dlg.setMultiChoiceItems(versionArray, checkArray,
                        new DialogInterface.OnMultiChoiceClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                                // 체크된 항목을 버튼에 표시 (마지막 체크 기준)
                                button1.setText(versionArray[which]);
                            }
                        });

                dlg.setPositiveButton("확인", null);
                dlg.setNegativeButton("닫기", null);
                dlg.show();
            }
        });
    }
}
<!--main1.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:gravity="center_horizontal">


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:text="목록 대화상자"
        android:textSize="20dp"
        />


</LinearLayout>

 

사용자 정의 대화상자 시험범위

<!--main1.xml   1차 수정-->

<?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:gravity="center_horizontal">


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:text="목록 대화상자"
        android:textSize="20dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tvName"
        android:text="사용자 이름" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tvEmail"
        android:text="이메일"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button2"
        android:text="click here"/>

</LinearLayout>

'computing' 카테고리의 다른 글

javaweb 13 정리  (0) 2025.11.26
20251124_iOS12  (0) 2025.11.24
20251117 - iOS12  (0) 2025.11.17
android11  (0) 2025.11.13
20251103_iOS10  (0) 2025.11.03