Android - 레이아웃 상속 뷰 만들기

유의선·2023년 7월 7일
0

새 뷰를 만들 레이아웃을 만든다.
하나의 이미지뷰와 두개의 텍스트뷰를 추가하여 만들었다.

만든 레이아웃을 카드뷰 모양으로 바꾼다.
코드에서 카드뷰 태그를 추가하고 만든 레이아웃을 카드뷰 안에 들어가도록 한다.

<androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="#FFFFFFFF"
        app:cardCornerRadius="10dp"
        app:cardElevation="5dp"
        app:cardUseCompatPadding="true">


cardCornerRadius 속성으로 모서리를 둥들게 만들었고
cardElevation 속성으로 뷰가 올라온 느낌이 들도록 만들었고
cardUseCompatPadding 속성으로 기본 패딩이 적용되도록 하였다.


XML 레이아웃 파일과 매칭될 클래스 파일을 만든다.

LinearLayout을 상속하도록 하고,
생성자를 만들고,
객체를 초기화하는 init 메소드를 추가하여 생성될 때 호출한다.

public class Layout1 extends LinearLayout {
    ImageView imageView;
    TextView textView;
    TextView textView2;
    
    public Layout1(Context context) {
        super(context);
        init(context);
    }

    public Layout1(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.layout1, this, true);
        
        imageView = findViewById(R.id.imageView);
        textView = findViewById(R.id.textView);
        textView2 =findViewById(R.id.textView2);
    }
}

init 메소드 안에는 LayoutInflater 객체를 참조하여 XML 레아이웃 파일과 인플레이션을 하였다.
인플레이션을 한 후, XML 레이아웃의 뷰들의 찾아 참조하였다.

소스 코드에서 참조한 이미지뷰와 텍스트뷰를 변경할 수 있도록 set 메소드들을 정의한다.

    public void setImage(int resId){
        imageView.setImageResource(resId);
    }

    public void setName(String name){
        textView.setText(name);
    }

    public void setMobile(String mobile){
        textView2.setText(mobile);
    }

메인 액티비티에 새로운 뷰를 추가한다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <org.techtown.layout.Layout1
        android:id="@+id/layout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>



MainActivity.java 파일의 코드를 수정한다.

public class MainActivity extends AppCompatActivity {
    Layout1 layout1;

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

        layout1 = findViewById(R.id.layout1);

        layout1.setImage(R.drawable.ic_launcher_foreground);
        layout1.setName("AAA");
        layout1.setMobile("000-0000-0000");

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                layout1.setImage(R.drawable.profile1);
            }
        });

        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                layout1.setImage(R.drawable.profile2);
            }
        });
    }
}

생성 시 Layout1 뷰를 참조하여 이미지, 이름, 전화번호를 참조해 설정하였고,
버튼을 누를 시 이미지가 변경되도록 하였다.

0개의 댓글