2017-09-11 42 views
0

我不知道這是否是重複問題,但我沒有找到任何解決方案。創建BaseFragment並在ChildFragment中擴展此片段

問題是,有一個屏幕在所有屏幕中具有相似的視圖,屏幕在片段中。

所以,我想創建一個基片段,並希望在所有子片段中擴展這個基片段。

我在google上找到了演示示例,但是我沒有找到任何解決方案。

我不知道從哪裏開始。

請幫幫我。

,我發現這個鏈接,但它沒有太大明確:

  1. Fragments inheritance Android

  2. When do I need a base activity and base fragment?

BaseFragment.java

public class BaseFragment extends Fragment { 

    public BaseFragment() { 
    // Required empty public constructor 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    return inflater.inflate(R.layout.fragment_base, container, false); 
    } 
} 

ChildFragment.Java

public class ChildFragment extends BaseFragment{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_child, container, false); 
    } 
} 

現在,在fragment_child佈局中有一個TextView。當我運行應用程序, 但在fragment_base其他兩個視圖中顯示,未顯示...

enter image description here

+0

我明白你想要什麼,但我不明白你的問題。問題是什麼? –

+0

我是新來的android,這是我第一次使用片段。所以我不知道如何開始以及從哪裏開始。 –

+0

如果有任何使用基本片段的演示示例,那麼這將有所幫助 –

回答

0

BaseFragment擴展片段類,然後你的其他片段延伸BaseFragment

public class BaseFragment extends Fragment 

public class AboutFragment extends BaseFragment 

如果你想在其他佈局:

View headView = LayoutInflater.from(getContext()).inflate(R.layout. - your Fragment layout - , null, false); 

這是爲我工作。

希望它有幫助。

+0

請看我編輯的問題... –

+0

@DemoMail檢查我的更新 –

+0

BaseFragment應該是抽象類。 – nuhkoca

0

您可以通過爲每個子片段的基地佈局實現這一目標。然後,您需要將基礎片段中的視圖綁定到基礎佈局中的所有基礎視圖。對於子視圖佈局,您需要將其綁定到子片段中。

在這裏,步驟:

  1. 創建基礎片段佈局(fragment_base.xml):

    <?xml version="1.0" encoding="utf-8"?> 
        <RelativeLayout> 
    
         <!-- Declare your view here --> 
         <android.support.v7.widget.AppCompatTextView 
          android:id="@+id/sample_tv" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:text="Sample"/> 
    
    </RelativeLayout> 
    
  2. 創建基礎片段

    public class BaseFragment extends Fragment { 
    
        public BaseFragment() { 
        // Required empty public constructor 
        } 
    
        ... 
    } 
    
  3. 創建基礎方法在基本片段中綁定視圖。這將被覆蓋並重用在你的子片段中。這裏我們使用bindView()名稱:

    public class BaseFragment extends Fragment { 
    
        protected AppCompatTextView mTvSample; 
        ... 
    
        protected void bind view(View view) { 
        mTvSample = view.findViewById(R.id.sample_tv); 
        } 
        ... 
    
    } 
    
  4. 通過重用基地佈局創建子佈局。您可以使用,包括。它應該是這樣的(fragment_child.xml):

    <?xml version="1.0" encoding="utf-8"?> 
        <RelativeLayout> 
    
         <include 
          layout="@layout/fragment_base" 
          android:layout_width="match_parent" 
          android:layout_height="match_parent" 
         /> 
    
         <!-- Child view --> 
         <android.support.v7.widget.AppCompatTextView 
          android:id="@+id/child_tv" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:text="Child Sample"/> 
    
    </RelativeLayout> 
    
  5. 現在,您可以通過擴展底座片段創建子片段。您需要記住使用並覆蓋bindView()。所以,你需要做這樣的事情:

    public class ChildFragment extends BaseFragment { 
        private AppCompatTextView mTvChild; 
        public ChildFragment() { 
        // Required empty public constructor 
        } 
    
    
        @Override 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, 
             Bundle savedInstanceState) { 
    
        View view = inflater.inflate(R.layout.fragment_child, container, false); 
    
        bindView(view); 
        return view; 
        } 
    
        @Ovverride 
        protected void bindView(View view) { 
        super.bindView(view); // call base method to bind the base view 
        mTvChild = view.findViewById(R.id.child_tv); 
        } 
    } 
    
+0

as you added tag in child_fragment,我是否需要像這樣對每個視圖進行更改? –

+0

我對所有片段中的視圖都具有相同的功能。我可以只寫一次該功能並在其他片段中使用其他視圖嗎? –

+0

沒錯。這意味着您想要在您的孩子中重複使用fragment_base佈局。 –

1

抽象類的方法呢?

我明白你在做什麼(繼承)。但正如@hobokent所指出的那樣,僅通過繼承BaseClass就不會在BaseClass佈局上包含您的childView佈局。
那麼有很多方法可以克服這個問題
讓我們來看看這個。

  • 創建一個抽象類,這將延長片段類(此 將BaseClass的)。

  • 使抽象方法返回佈局。

  • 在ChildClass中提供您的抽象方法的實現。

這裏是代碼片段。

BaseClass的

public abstract class BasicFragment extends Fragment { 

    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    } 

    public View onCreateView(LayoutInflater inflater,ViewGroup parent, Bundle savedInstanseState) 
    { 
     View view = provideYourFragmentView(inflater,parent,savedInstanseState); 
     return view; 
    } 

    public abstract View provideYourFragmentView(LayoutInflater inflater,ViewGroup parent, Bundle savedInstanceState); 

} 

ChildClass

public class ImageFragment extends BasicFragment{ 

    @Override 
    public View provideYourFragmentView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.image_fragment,parent,false); 

    //Now specific components here (you can initialize Buttons etc) 

    return view; 
    } 


} 

針對您的特殊要求,如果你想相同的佈局出現在子類的佈局。您可以再次創建一個返回佈局的方法,也可以在您的子佈局中爲BaseClass佈局創建一個佔位符,並使用child.add(base_layout)在childLayout中添加BaseClass佈局。 這又是一個設計解決方案。
您也可以將活動佈局中的常見佈局和片段中的活動佔位符中的添加片段。 有n個可能的解決方案。

我沒有任何特定於您的要求的代碼,但這裏是我爲TabLayout實現此方法的示例,其中每個選項卡是具有不同佈局的不同片段。
Github full code sample