sourcecode

Android - 사용자 정의(복합) 구성 요소 작성

copyscript 2022. 9. 24. 10:13
반응형

Android - 사용자 정의(복합) 구성 요소 작성

제가 현재 개발하고 있는 안드로이드 앱은 크게 성장한 메인 액티비티를 가지고 있습니다.이것은, 주로, E-M-M-메일을 포함한TabWidget3개의 탭이 있습니다.각 탭에는 꽤 많은 구성 요소가 있습니다.액티비티는 이러한 모든 컴포넌트를 한 번에 제어해야 합니다.이 액티비티에는 약 20개의 필드(거의 모든 컴포넌트에 대한 필드)가 있습니다.또한 많은 로직(청취자 클릭, 목록 채우기 로직 등)이 포함되어 있습니다.

컴포넌트 기반 프레임워크에서는 일반적으로 모든 것을 커스텀 컴포넌트로 분할합니다.각 커스텀 컴포넌트는 명확한 책임을 지게 됩니다.자체 컴포넌트 세트 및 해당 컴포넌트와 관련된 다른 모든 논리를 포함합니다.

어떻게 하면 좋은지 알아보려고 했는데 Android 문서에서 컴포지트 컨트롤이라고 불리는 것을 발견했습니다.(http://developer.android.com/guide/topics/ui/custom-components.html#compound을 참조하여 '컴포지트 컨트롤' 섹션으로 스크롤) 뷰의 XML 파일을 기반으로 컴포넌트를 만들고 싶습니다.록쳐

문서에는 다음과 같이 기재되어 있습니다.

액티비티와 마찬가지로 선언형(XML 기반) 방식을 사용하여 포함된 컴포넌트를 작성하거나 코드로부터 프로그래밍 방식으로 중첩할 수 있습니다.

그거 좋은 소식이네요!XML 기반의 접근법이 바로 제가 원하는 것입니다!하지만 '활동과 같다'는 것 말고는 어떻게 하는지는 나와 있지 않다.단, 액티비티에서 제가 하는 일은setContentView(...)XML에서 보기를 부풀립니다. 예를 들어 하위 클래스에서 이 메서드를 사용할 수 없습니다.LinearLayout.

그래서 XML을 수동으로 부풀리려고 했습니다.

public class MyCompoundComponent extends LinearLayout {

    public MyCompoundComponent(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.my_layout, this);
    }
}

로딩하고 있는 XML에 다음과 같은 기능이 있는 것을 제외하고, 이 기능은 동작합니다.LinearLayout루트 요소로 선언되었습니다.그 결과 부풀어 오른다.LinearLayout의 아이인 모양MyCompoundComponent그 자체가 이미LinearLayout! 이제 용장 Linear Layout이 그 사이에 있습니다.MyCompoundComponent실제로 필요한 뷰가 있습니다.

누가 좀 더 나은 방법으로 접근해 줄 수 있나요? 중복되는 일이 없도록요.LinearLayout인스턴스화?

병합 태그를 XML 루트로 사용

<merge xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Your Layout -->
</merge>

이 기사를 확인해 주세요.

이 작업을 수행하는 방법은 클래스 이름을 XML 루트 요소로 사용하는 것입니다.

<com.example.views.MyView xmlns:....
       android:orientation="vertical" etc.>
    <TextView android:id="@+id/text" ... />
</com.example.views.MyView>

그런 다음 원하는 레이아웃에서 클래스를 추출합니다.이 방법을 사용하는 경우 여기서는 레이아웃 인플레이터를 사용하지 않습니다.

public class MyView extends LinearLayout
{
    public ConversationListItem(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }
    public ConversationListItem(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }


    public void setData(String text)
    {
        mTextView.setText(text);
    }

    private TextView mTextView;

    @Override
    protected void onFinishInflate()
    {
        super.onFinishInflate();

        mTextView = (TextView)findViewById(R.id.text);
    }
}

그런 다음 정상적으로 XML 레이아웃에서 보기를 사용할 수 있습니다.보기를 프로그래밍 방식으로 만들려면 직접 화면을 팽창해야 합니다.

MyView v = (MyView)inflater.inflate(R.layout.my_view, parent, false);

도 이렇게 안 요.v = new MyView(context)왜냐하면 중첩된 레이아웃 문제를 해결할 방법이 없는 것 같기 때문에, 이것은 완전한 해결책이 아닙니다. 해서 이런 될 것 같아요.MyView 좋게 : to to to to to to to :

public static MyView create(Context context)
{
    return (MyView)LayoutInflater.fromContext(context).inflate(R.layout.my_view, null, false);
}

면책사항:내가 완전히 헛소리를 하고 있는지도 몰라.

언급URL : https://stackoverflow.com/questions/1476371/android-writing-a-custom-compound-component

반응형