2012-12-10 2 views
0

재사용 가능한 위젯을 만들고 싶습니다. 표준 요소의 서수 합성이어야합니다. 가장 좋은 방법은 무엇입니까? 아래는 현재 사용하고있는 코드 샘플이지만 좀 더 우아 할 수도 있습니다. 또한 아래 샘플은 런타임에서 완벽하게 실행되지만 Eclipse의 시각적 편집기가 예외를 던지고 있습니다 (현재로서는 저에게 문제가되지 않습니다). 복합 소재를 만드는 데 권장되는 방법이 있습니까? 조각을 사용해야합니까?컴포지트 위젯 - 원하는 방식은 무엇입니까?

public class MyComposite extends LinearLayout { 

    private ImageView m_a1; 
    private ImageView m_a2; 
    private ImageView m_w1; 
    private ImageView m_w2; 
    private ImageView m_w3; 
    private ImageView m_w4; 

    public CallBackSlider(final Context context) { 
    this(context, null); 
    } 

    public CallBackSlider(final Context context, final AttributeSet attrs) { 
    super(context, attrs); 

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(R.layout.my_composite, this, true); 
    setupViewItems(); 
    } 

    private void setupViewItems() { 
    m_a1 = (ImageView) findViewById(R.id.A1Img); 
    m_w1 = (ImageView) findViewById(R.id.Wave1Img); 
    m_w2 = (ImageView) findViewById(R.id.Wave2Img); 
    m_w3 = (ImageView) findViewById(R.id.Wave3Img); 
    m_w4 = (ImageView) findViewById(R.id.Wave4Img); 
    m_a2 = (ImageView) findViewById(R.id.A2Img); 
    resetView(); 
    } 

    private void resetView() { 
    m_w1.setAlpha(0); 
    m_w2.setAlpha(0); 
    m_w3.setAlpha(0); 
    m_w4.setAlpha(0); 
    } 
} 

레이아웃 XML :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/MyComposite" 
    ... > 

    <ImageView 
    android:id="@+id/A1Img" 
    android:src="@drawable/a1" 
    ... 
    /> 

    <ImageView 
    android:id="@+id/Wave1Img" 
    ... 
    android:src="@drawable/wave1" /> 

    <ImageView 
    android:id="@+id/Wave2Img" 
    ... 
    android:src="@drawable/wave2" /> 

    <ImageView 
    android:id="@+id/Wave3Img" 
    ... 
    android:src="@drawable/wave3" /> 

    <ImageView 
    android:id="@+id/Wave4Img" 
    ... 
    android:src="@drawable/wave4" /> 

<ImageView 
    android:id="@+id/EarImg" 
    ... 
    android:src="@drawable/a2" /> 

</LinearLayout> 

그럼 당신은 이런 식으로 다른 레이아웃에서 사용할 수 있습니다 :

... 
<your.package.MyComposite 
    android:id="@+id/mc1" 
    ...  
/> 
... 

그리고 MyComposite 클래스의 Java 코드뿐만 아니라 인스턴스에서 사용합니다.

답변

1

예를 들어 병합 된 병합이 필요하다고 생각합니다.

위젯의 표준 동작을 변경해야 할 경우 사용자 정의 위젯을 사용하십시오.

standart 동작으로보기 그룹이 필요한 경우이를 병합하면 충분합니다.

some_activity.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    // some views 

    <include layout="@layout/view_part"/> 

    // probably more views 

</LinearLayout> 

view_part.xml : 최근 중첩 단편 (SDK 4.1 또는 4.2과의 compat 라이브러리) 도입

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

     <ImageView 
     android:id="@+id/A1Img" 
     android:src="@drawable/a1" 
     ... 
     /> 

     <ImageView 
     android:id="@+id/Wave1Img" 
     ... 
     android:src="@drawable/wave1" /> 

     <ImageView 
     android:id="@+id/Wave2Img" 
     ... 
     android:src="@drawable/wave2" /> 

     <ImageView 
     android:id="@+id/Wave3Img" 
     ... 
     android:src="@drawable/wave3" /> 

     <ImageView 
     android:id="@+id/Wave4Img" 
     ... 
     android:src="@drawable/wave4" /> 

     <ImageView 
     android:id="@+id/EarImg" 
     ... 
     android:src="@drawable/a2" />  

    </merge> 
+0

병합 된 위젯이 무엇인지 찾으려고합니다. 좋은 설명을 가르쳐 주시겠습니까? 왜 그것이 좋고 언제 사용해야하는지. –

+0

예를 들어, 버튼을 클릭하면 항상 토스트 메시지를 만들거나 다른 스 와이프 애니메이션을 가진 갤러리가 필요합니다. 따라서이 상황에서는 갤러리 또는 버튼을 확장하여 사용자 정의보기를 만들어 yor 활동에서 쉽게 사용할 수 있습니다. 그러나 귀하의 질문에 당신은 standat 행동과 위젯 그룹이 필요합니다. 그래서 당신은 그들을 병합하여 당신의 활동에 사용해야합니다. – Talha

1

. 그러나 나는 당신처럼 단순한 위젯보다 복잡한 UI 조각을 캡슐화하기 위해 이러한 중첩 된 조각을 사용해야한다고 생각하는 경향이 있습니다.

사용자 정의 위젯의 일반적인 방법은 onFinishInflate 메소드를 대체하는 것입니다. that blog에 대한 자습서가 있습니다.

public class TwoTextWidget extends LinearLayout { 
    private TextView textOne; 
    private TextView textTwo; 

    public TwoTextWidget(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     ((Activity)getContext()).getLayoutInflater().inflate(R.layout.two_text_component, this); 
     setupViewItems(); 
    } 

    private void setupViewItems() { 
     textOne = (TextView) findViewById(R.id.text_one); 
     textTwo = (TextView) findViewById(R.id.text_two); 
    } 

    public void setTextOne(String text) { 
     textOne.setText(text); 
    } 

    public void setTextTwo(String text) { 
     textTwo.setText(text); 
    } 
} 

당신은 사용자 지정 특성을 사용하여 위젯 더 많은 사용자 정의를 허용 할 수 있습니다 :

여기에 코드의 해당 작품이다. that other blog을 확인하십시오.

+0

내가 언급 한 두 블로그를 준비했습니다. onFinishInflate()를 재정의하는 samlpe 코드에 몇 가지 문제가있었습니다. 이것은 권장 방법입니까 아니면 누군가의 아이디어입니까? 나 또한 사용자 지정 특성에 대해 알고 : http://stackoverflow.com/questions/5706038/long-press-definition-at-xml-layout-like-androidonclick-does/13417824#13417824 –

+0

다음 당신은 내가 추측 할 필요가 모든 것을 안다 :) onFinishInflate에 어떤 문제도 없었습니다. 그것이 제가 가장 많이 본 접근입니다. 몇 가지 오픈 소스 위젯을 탐색하여 그들이 어떻게했는지 확인할 수 있습니다. –