Upgrade to Pro — share decks privately, control downloads, hide ads and more …

深入淺出談fragment

fantasy
January 30, 2015

 深入淺出談fragment

有基本知識來介紹frgament元件,到要如何使用fragment,以及需要注意的地方。

fantasy

January 30, 2015
Tweet

More Decks by fantasy

Other Decks in Programming

Transcript

  1. What is fragment? Is it another type of Activity? Does

    it replace Activity? Or is it a new component ?
  2. What is fragment? Is it another type of Activity? Does

    it replace Activity? Or is it a new component ? It is a modular section of an activity!!
  3. Relationship with Activity Embedded in an activity surely Depend on

    activity lifecycle Inside activity’s view hierarchy
  4. How to use fragment 1 <fragment 2 android:id="@+id/list" 3 android:name=“com.new.ExampleFragment"

    4 android:layout_width="match_parent" 5 android:layout_height="match_parent" /> Inside the activity’s layout
  5. Add fragment programmatically 1 FragmentManager fm = getFragmentManager(); 2 FragmentTransaction

    ft = fm.beginTransaction(); 3 ExampleFragment fragment = new ExampleFragment(); 4 ft.add(R.id.fragment_container, fragment); 5 ft.commit(); 1 <FrameLayout 2 android:id="@+id/fragment_container" 3 android:layout_width="wrap_content" 4 android:layout_height=“wrap_content"/>
  6. Fragment Transactions 1 FragmentTransaction ft = fm.beginTransaction(); 2 ft.add(R.id.fragment_container, fragment);

    3 ft.replace(R.id.fragment_container, fragment); Modify fragment 4 ft.show(fragment) 5 ft.hide(fragment) 6 ft.remove(fragment) Modify fragment already in activity Set transition style 7 ft.setTransition(TRANSIT_FRAGMENT_CLOSE) 8 ft.setCustomAnimations(entet,exit)
  7. 1 public class ChannelDetailFragment extends Fragment { 2 private OnChannelClickListener

    mCallback; 3 4 public interface OnChannelClickListener { 5 public void onChannelClick(int channelNumber); 6 } 7 @Override 8 public void onAttach(Activity activity) { 9 super.onAttach(activity); 10 try { 11 mCallback = (OnChannelClickListener) activity; 12 } catch (ClassCastException e) { 13 throw new ClassCastException(activity.toString() 14 + " must implement OnChannelClickListener"); 15 } 16 } 17 public boolean onClick(View v) { 18 mCallback.onChannelClick(channelNumber); 19 } In fragment file
  8. In activity file 1 public class Activity extends Activity 2

    implements OnChannelClickListener { 3 4 @Override 5 public void onChannelClick(int channelNumber){ 6 // do something or open another fragment. 7 } 8 }
  9. Fragment view Use setContentView() to set view? 1 @Override 2

    public View onCreateView(LayoutInflater inflater, ViewGroup 3 container, Bundle savedInstanceState) { 4 View root = inflater.inflate(R.layout.fragment_layout, 5 container, false); 6 //init other view 7 return root; 8 } Use onCreateView callback to set view !
  10. Fragment tips Toast.makeText(getActivity(), "Mission complete", Toast.LENGTH_LONG); Get context from activity

    Add to BackStack 1 FragmentManager fm = getFragmentManager(); 2 FragmentTransaction ft = fm.beginTransaction(); 3 ft.replace(R.id.fragment_container, fragment); 4 ft.addToBackStack(null);
  11. Import v4 or origin version 1 import android.support.v4.app.FragmentActivity; 2 import

    android.support.v4.app.FragmentManager; 3 import android.support.v4.app.FragmentTransaction; 4 import android.support.v4.app.Fragment; 1 import android.app.Activity; 2 import android.app.FragmentManager; 3 import android.app.FragmentTransaction; 4 import android.app.Fragment;
  12. Use new Fragment() or Fragment.newInstance()? 1 ChannelFragment fragment = new

    ChannelFragment(); 2 Bundle args = new Bundle(); 3 args.putInt(CHANNEL_PAGE_INDEX, index); 4 fragment.setArguments(args);
  13. 1 public static ChannelFragment newInstance(int index) { 2 ChannelFragment fragment

    = new ChannelFragment(); 3 Bundle args = new Bundle(); 4 args.putInt(CHANNEL_PAGE_INDEX, index); 5 fragment.setArguments(args); 6 return fragment; 7 } ChannelFragment.newInstance(index); Use static factory method for better!