마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

★★★ 안드로이드 스튜디오 setContentView 하고 SurfaceTextureView 관련 질문입니다. ★★★

0 추천
제가 만드려는 것은, 예를 들어 AAA 클래스와 BBB 클래스가 있다고 가정할 때,
AAA 클래스의 화면에서 어떤 버튼을 하나 누르면 BBB 클래스의 화면으로 바뀌고,
BBB 클래스 화면으로 바뀐 상태에서 뒤로가기를 누르면 다시 AAA 클래스 화면으로
돌아가게 하는 것입니다. BBB 클래스의 화면으로 바뀌는 순간,
AAA 클래스의 화면에 있던 버튼들을 포함한 위젯들은 모두 사라져야겠죠

이것을 XML이 한 개인 상태에서 setContentView를
사용해서 구현하는 게 가능한지가 궁금합니다.

지금 제가 시도하는 방법은 AAA 클래스에서 XML 파일을
화면으로 사용하고, 거기서 setContentView 메소드의
매개 값으로 BBB 클래스의 참조변수를 전달함으로써
BBB 클래스 화면으로 바꾸는 방식입니다.

(사실 이건 화면을 바꾼다기보다, AAA 클래스의 화면에서
발생할 여러가지를 BBB 클래스에서 코딩한다라는게
더 정확한 표현일 수 있겠군요.)

지금 제가 setContentView 메소드를 사용해서 화면을 바꾸면
뒤로가기를 눌렀을 때 앱 자체가 종료 되버리는데요.
앱이 종료되지 않고 이전 화면으로 돌아가게 만드는 것을
구현하고 싶습니다.

물론 Intent를 이용하면 뒤로가기를 눌러도 앱이 종료되지 않고
이전 화면으로 갈 수 있기는 합니다. 하지만, BBB 클래스는 Canvas랑
Paint 등을 이용할 것이기 때문에 AppCompatActivity 클래스가 아니라
TextureView 클래스를 상속 받고 있거든요. 그 때문인지는 몰라도
AAA 클래스 화면에서 Intent를 활용하여 BBB 클래스 화면으로
바꾸려고 하면 앱이 오류가 나면서 팅겨버립니다.

그렇다고 해서 BBB 클래스를 위한 XML을 하나 더 만든다고 해도
Activity 관련 클래스가 아닌 TextureView 클래스를 상속하고 있다보니
setContentView 메소드를 사용할 수가 없네요. Activity 관련 클래스를
상속하면 되지 않냐고 해도, 그러면 Canvas를 사용할 수가 없어요.

실력이 한참 부족한 저로서는 진퇴양난이네요. ㅜㅜ
일단 제가 짠 코드를 보여드리겠습니다.

--------------- 아래는 AAA 클래스 입니다. ---------------

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class AAA extends AppCompatActivity
{
    private BBB bbb;

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

        bbb = new BBB(this);

        startButton = (Button)findViewById(R.id.Start_Button);
        startButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                setContentView(bbb);
            }
        });
    }
}

--------------- 아래는 BBB 클래스 입니다. ---------------

import android.content.Context;
import android.graphics.SurfaceTexture;
import android.view.TextureView;

public class BBB extends TextureView implements TextureView.SurfaceTextureListener
{
    public BBB(Context context)
    {
        super(context);
        setSurfaceTextureListener(this);
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1)
    {

    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1)
    {

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture)
    {
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture)
    {

    }
}

위 두 코드가 바로 각각 AAA 클래스, BBB 클래스입니다.
어떻게든 해결해보려고 셀 수 없는 시도를 해보고 수많은
수정을 거쳤는데도 해결하지 못했습니다. ㅜㅜ

------------------------------------------------------------

질문이 길어서 불편하신 분들을 위해 짧게 정리하자면,
AAA 클래스에서 setContentView 메소드를 활용하여 BBB 클래스로
화면 전환을 하고 싶은데, BBB 클래스 화면으로 바뀐 상태에서 뒤로가기를
눌렀을 때 앱이 종료되지 않고 이전 화면으로 (AAA 클래스 화면으로)
돌아가게 하는 방법을 알고 싶습니다.

단, BBB 클래스에서는 Canvas와 Paint 등등 그림 그리는 기능을
이용할 것이기 때문에 TextureView 클래스를 상속하고 있구요.

그렇기 때문에 이 BBB 클래스는 Activity 관련 클래스를
상속하고 있지 않으므로 setContentView 메소드를 사용할 수
없기 때문에 AAA 클래스 화면으로 쓰이고 있는 XML 파일을
BBB 클래스에서도 써야하는데, 하나의 XML 파일을 같이 쓰려고
하다보니 BBB 클래스 화면에서는 AAA 클래스 화면의 위젯들이
하나도 안보여야 합니다. 어떻게 해야 될지 알려주세요. ㅠㅠ

------------------------------------------------------------

저 진짜 이 문제 때문에 이런저런 방법은 다 시도해보고
정말 열심히 제가 할 수 있는 노력을 다 해보았는데도 도저히
해결되지가 않아서 도움을 요청하는 겁니다. ㅠㅠ

제발 도와주세요. ㅜㅜ

(만약 아예 색다른 방법으로 해결이 가능하다면
어떻게 해야 하는지 알려주세요 ... ㅠㅠ)
abchs8wyw (1,710 포인트) 님이 2016년 10월 27일 질문

1개의 답변

+1 추천
 
채택된 답변
1. bbb 클래스에 해당하는 activity를 띄우시는게 제일 쉽게 그냥 되는것이구요  back key 는 알아서 동작될 겁니다.

2. onBackPressed 를 override 한 뒤 현재 rootview 가 어떤 형태인지 파악한 뒤 textureview 면 변경해주면 될듯 한데

일단 setContentView 로 내용을 변경하려는 이유라도 있는건가요?
aucd29 (218,390 포인트) 님이 2016년 10월 28일 답변
abchs8wyw님이 2016년 11월 2일 채택됨
이 방법만을 고집하는게 아니라, 아직 초보자라서
다른 방법을 모를 뿐입니다. ㅜㅜ

그래서 아예 다른 방법이 있다면 알려 주셨으면 좋겠다고
한 것이죠. 이제 막 첫 걸음 때는 수준이라 실력이 부족해서 T_T

이런저런 문제가 발생했을 때 어떻게
해결해야 하는지 잘 모릅니다. ㅠㅠ

일단 좋은 답변 감사드립니다. ^^ 그런데, BBB 클래스에 해당하는
액티비티를 띄우라는 문장이 잘 이해가 안가서 ... 좀 더 자세히
알려주실 수 있을까요 ?

그리고 onBackPressed를 오버라이드 하려면 Activity 클래스를
상속 받아야 할텐데 지금 BBB 클래스는 TextureView 클래스를
상속 받고 있어서 힘들지 않나요?
1. 일단 화면에 보이기 위한 기본은 Activity 이고 이 Activity 내에 View 가 들어가는 형태로 구성 됩니다. 즉 Activity + View 가 짝을 이루어야지만 화면에 보이는 것 이죠
AAA 클래스는 Activity 와 setContentView 로 xml 을 가져와 View 를 구성하므로 화면에 나타는 형태이니 BBB 클래스 역시 Activity 를 상속 하고 AAA 에서 startActivity 를 통해 BBB 를  띄우세요

https://developer.android.com/training/basics/firstapp/starting-activity.html
...