2

나는 안드로이드의 조각에별로 익숙하지 않다. 내 마지막 프로젝트에서 나는 TabActivity를 사용하고 있었지만 지금은 Deprecation 때문에 시작하고 있는데, Fragments를 사용하여 ActionBar를 구현하고있다.중첩 된 조각을 피하는 ActivityTab 안의 Android MasterDetail 레이아웃

public class TabInterventoClass extends FragmentActivity{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(false); 

    Tab tab = actionBar.newTab() 
      .setText("Dati") 
      .setTabListener(new TabListener<DatiFragment_>(this, "dati", DatiFragment_.class)); 
    actionBar.addTab(tab); 

    tab = actionBar.newTab() 
      .setText("Sistemi alimentazione") 
      .setTabListener(new TabListener<SistemaAlimentazioneFragment_>(this, "Sistemi alimentazione", SistemaAlimentazioneFragment_.class)); 
    actionBar.addTab(tab); 

    tab = actionBar.newTab() 
     .setText("Home") 
     .setTabListener(new TabListener<HomeFragment_>(this, "home", HomeFragment_.class)); 
    actionBar.addTab(tab); 
} 

나는이 방법으로 ActionBar.TabListener을 구현했습니다 :

public class TabListener<T extends Fragment> implements ActionBar.TabListener { 
    private Fragment mFragment; 
    private final FragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 

    public TabListener(FragmentActivity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     // Check if the fragment is already initialized 
     if (mFragment == null) { 
      // If not, instantiate and add it to the activity 
      mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      // If it exists, simply attach it in order to show it 
      //ft.attach(mFragment); 
      ft.show(mFragment); 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      // Detach the fragment, because another one is being attached 
      //ft.detach(mFragment); 
      ft.hide(mFragment); 
     } 
    } 
} 

이/부착에 대한 설명을 참고 찬성 방법을 분리하십시오 여기

내 탭 클래스의 코드 표시/숨기기. 왜냐하면 두 번째 탭에 두 번째 탭 (두 번째 탭 단편의 잘못된 디자인에 대해)을 입력했기 때문입니다. 다음은 예외!

10-18 11:10:13.093: E/AndroidRuntime(3777): Caused by: java.lang.IllegalArgumentException: Binary XML file line #38: Duplicate id 0xffffffff, tag sistemiList, or parent id 0x0 with another fragment for it.cpmapave.mt.ui.intervento.SistemaAlimentazioneListFragment_ 

(.. 문제를 해결하지만 그의 어댑터를 새로 고침하기 위해 그것을 얻을 수있는 방법이 필요합니다 그래서 대신 첨부의/숨기기 조각 /을 보여 태그와 <fragment android:name="it.cpmapave.mt.ui.intervento.SistemaAlimentazioneListFragment_" />의 ID를 제거 떼다). 운좋게도 방향을 수정해야 표시/숨기기를 사용하여 방향이 바뀌면 조각이 겹치는 문제가 없습니다.

여기 Fragment 클래스를 확장하는 첫 번째 탭 표시 DatiFragment가 있습니다.

First Fragment

는 그리고 이것은 괜찮을 것 같다!

여기는 StrumentiFragment를 표시하는 두 번째 탭에 있습니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_marginLeft="16dp" 
android:layout_marginRight="16dp" 
android:divider="?android:attr/dividerHorizontal" 
android:showDividers="middle"> 
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 
    <TextView 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" 
     android:gravity="center_vertical" 
     android:text="Sistema di alimentazione:" /> 

    <Spinner 
     android:id="@+id/sistemiDiAlimentazione" 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" /> 

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

</LinearLayout> 
<LinearLayout 
    android:baselineAligned="false" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 
    <fragment android:name="it.cpmapave.mt.ui.intervento.SistemaAlimentazioneListFragment_" 
     android:layout_width="0dp" 
     android:tag="sistemiList" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 
    <FrameLayout android:id="@+id/item_detail_container" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="3" /> 
</LinearLayout> 

enter image description here

업데이트 조각 C.

에 조각 목록 B 업데이트 세부 사항에서 요소를 선택하면 FragmentList B를 조각 A의 회 전자에서 요소를 추가 : 여기 레이아웃입니다

이 문제는 중첩 된 조각으로 인해 발생할 수 있다고 생각합니다.하지만 다른 방식으로 설계하는 것이 어떨지는 모르겠지만 어쩌면 실제로 그 것보다 더 어렵게 만들 수 있습니다.

저는 ActionBarSherlock을 사용하고 있다는 코드를 생략하고 설명하기 위해 내 문제의 원인이 아닌 것으로 생각하기 때문에 생략했습니다!

그래서 마지막에 .. 질문은 :

내가 한 두 번째 사진에서 보여 같은 기능적인 레이아웃을 받아야합니다. 그러나 중첩 된 단편들에 의해서만 그것을 얻었습니다. 나는 그것을하지 말아야합니다. 어떻게해야합니까?

는 마르코

+0

프래그먼트가 잠시 멈추고 다시 시작되지 않기 때문에 탭 활동에서 숨기고 표시하는 것이 좋지 않습니다. 내 값이 db에 저장되지 않습니다. – gipinani

+0

무엇이 질문입니까? – vikki

+0

두 번째 그림에 표시된 것과 같은 기능적 레이아웃을 얻어야합니다. 그러나 중첩 된 단편들에 의해서만 그것을 얻었습니다. 나는 그것을하지 말아야합니다. 어떻게해야합니까? – gipinani

답변

3

내가 필요로 할 때 표시/숨기기하는 FrameLayout이 각 프레임을 넣어 해결했다 한 모든 응답을 주셔서 감사합니다.나는이 사람을 위해 도움이 될 수 있기를 바랍니다

<TabHost 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/tabhost" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TabWidget 
     android:id="@android:id/tabs" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0"/> 

    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 

    <LinearLayout 
     android:baselineAligned="false" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <FrameLayout 
      android:id="@+android:id/navtabcontent" 
      android:layout_width="0dp" 
      android:layout_height="600dp" 
      android:layout_weight="1"/> 
     <FrameLayout 
      android:id="@+android:id/realtabcontent" 
      android:layout_width="0dp" 
      android:layout_height="600dp" 
      android:layout_weight="3"/> 
    </LinearLayout> 
</LinearLayout> 

: 내 ActionTab을 만든 곳

는 또한 클래스의 사용자 정의 레이아웃을 정의했습니다!

관련 문제