2012-10-21 2 views
9

각 화면마다 동일한 항목 [탭으로 작동하는 5 개의 버튼]이 필요한 애플리케이션이 있습니다. 이 5 개의 버튼이있는 기본 XML 레이아웃을 만든 다음 다른 모든 XML 파일을 기본 레이아웃에서 어떤 방식으로 확장하여 궁극적으로 동일한 기능을 가진 여러 버튼을 가질 필요가 없습니까? .모든 활동에 일반적인 Android XML 레이아웃을 만드는 방법

그것은 효과적으로 만들고 다른 레이아웃에 복사 및 붙여 넣기하여 XML 소요 API 9

답변

13

기본 활동을위한 공통 레이아웃을 만듭니다. 그런 다음 동일한 레이아웃을 만들려는 <include> 태그를 사용하여 모든 레이아웃에 레이아웃을 포함하십시오.

그런 다음 하나의 추상 액티비티를 생성 한 다음이 액티비티에서 버튼 및 코드의 모든 클릭을 처리 한 다음 기본 레이아웃을 포함하는 다른 모든 액티비티에서이 액티비티를 확장합니다. 예를 들어

일반 버튼의 XML 레이아웃 여기

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/tabhost_bg" 
    android:gravity="center" 
    android:orientation="horizontal" 
    android:weightSum="3"> 

    <Button 
     android:id="@+id/btnHome" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bottom_btn_active" 
     android:layout_weight="1" 
     android:text="@string/label_home" 
     style="@style/bottom_tab_btn"/> 

    <Button 
     android:id="@+id/btnSetting" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bottom_btn_active" 
     android:layout_weight="1" 
     android:text="@string/label_settings" 
     style="@style/bottom_tab_btn"/> 

    <Button 
     android:id="@+id/btnMore" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bottom_btn_active" 
     android:layout_weight="1" 
     android:text="@string/label_more" 
     style="@style/bottom_tab_btn"/> 

</LinearLayout> 

당신이 XML 파일 위에 포함 할 수있는 XML 레이아웃입니다 여기

<include 
     android:id="@+id/bottombar" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     layout="@layout/bottom_bar" /> 

안드로이드 : layout_width와 안드로이드 : layout_height 및 layout은 필수 속성입니다.

지금 여기의 모든 활동이 기본 활동을 확장

public abstract class BottomBar extends Activity implements OnClickListener { 

    protected Button btnHome; 
    Button btnSetting, btnMore; 
    private Activity mActivity; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mActivity = this; 
    } 

    protected void mappingWidgets() { 

     btnHome = (Button) findViewById(R.id.btnHome); 
     btnSetting = (Button) findViewById(R.id.btnSetting); 
     btnMore = (Button) findViewById(R.id.btnMore); 

     btnHome.setOnClickListener(this); 
     btnSetting.setOnClickListener(this); 
     btnMore.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (v == null) 
      throw new NullPointerException(
        "You are refering null object. " 
          + "Please check weather you had called super class method mappingWidgets() or not"); 
     if (v == btnHome) { 

     } else if (v == btnSetting) { 

     }else if(v == btnMore) { 

     } 
    } 

    protected void handleBackgrounds(View v) { 
     if (v == btnHome) { 
      btnHome.setBackgroundResource(R.drawable.bottom_btn_hover); 
      btnSetting.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnMore.setBackgroundResource(R.drawable.bottom_btn_active); 

     } else if (v == btnSetting) { 
      btnHome.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnSetting.setBackgroundResource(R.drawable.bottom_btn_hover); 
      btnMore.setBackgroundResource(R.drawable.bottom_btn_active); 

     } else if (v == btnMore) { 
      btnHome.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnSetting.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnMore.setBackgroundResource(R.drawable.bottom_btn_hover); 
     } 
    } 

} 

이제 한 단계가 남아있는 일반 컨트롤의 클릭을 처리하는 기본 활동이다.

extends 키워드를 사용하여 활동의 기본 활동을 확장 할 수 있습니다. 예를

public class MyActivity extends BottomBar 

주 들어 : 자식 활동에서 당신은 당신의 기본 레이아웃의 공용 컨트롤의 클릭을 처리하기 위해 기본 클래스의 슈퍼 메소드를 호출 할 수 있어야합니다.

이렇게하면 단일 활동 내에 여러 개의 공통 레이아웃을 구현할 수 있습니다.

희망이 도움이 될 것입니다. 즐기십시오 !!

+0

기본 레이아웃의 ID를 구현하는 레이아웃에서이 ID에 액세스 할 수 있습니까? – zabawaba99

+0

호스트 레이아웃에서 포함 된 레이아웃의 구성 요소에 액세스 할 필요가 없다고 생각합니다. 정말로 afaik에 액세스하고 싶다면 그것을 사용할 수 있습니다. – Dharmendra

+0

정말 도움이되는 게시물 !! :) – Nitesh

3

You may want to look in to the <include> tag.에 의해 지원 될 수있는이 문제에 대한 더 나은 방법이 있습니다.

그렇다면 버튼 하나로 단일 레이아웃을 만드십시오. <merge> 태그 사이에 넣으므로 FrameLayout을 생성하지 않아야합니다. 그런 다음 <include> 태그를 사용하여 다른 레이아웃에서 동일한 레이아웃을 사용하십시오.

참고 : <include> 태그를 사용할 때는 항상 layout_widthlayout_height 속성을 무시하십시오. 동일한 값이있을 때 재정의하는 경우에도 마찬가지입니다. 이전 버전의 Android에는 특정 속성을 무시하지 않는 한 특정 속성을 무시하는 버그가 있습니다.

1

포함하는 방법이 포함되지만 나 자신을 안정적으로 작동시키지 못했습니다. 어쩌면 내가 뭔가 잘못하고 있지만, 컴파일러가 항상 병합 된 레이아웃의 ID를 선택하지 않습니다.

관련 문제