Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

[Hướng dẫn] Fragment

Discussion in 'Hướng dẫn lập trình Android' started by hoithegiantinhlagi, 15/8/13.

  1. hoithegiantinhlagi

    hoithegiantinhlagi Active Member

    Chào tất cả các bạn sau một thời gian dài "quy ẩn gian hồ" nay tại hạ đã trở lại và...tàn tạ hơn xưa=))
    Sáng giờ ngồi buồn mới nghiên cứu được một "vũ khí" rất lợi hại, một thứ có thể thay thế activity, đó là Fragment, nói chơi thôi chứ bỏ activity luôn thì ko được, nhưng theo mình biết thì xu hướng thị trường các app đều phát triển theo hướng sử dụng Fragment. Nào bây giờ chúng ta cùng tìm hiểu Fragment nhé.
    1/Định nghĩa: Fragment là một đối tượng được nhúng vào Activity, chúng ta có thể xem Fragment như là một hoặc nhiều giao diện (sub Activity) có lifecycle riêng và thường nằm cùng một màn hình.
    Fragment được thêm vào từ API level 11. Về lifecycle của Fragment bạn có thể tham khảo thêm tại đây: http://developer.android.com/guide/components/fragments.html
    Có các loại Fragment sau:
    ListFragment
    DialogFragment
    WebViewFragment

    PreferenceFragment
    Còn về đặc điểm của tụi nó các bạn tham khảo thêm cũng ở link trên.
    2/Cách dùng: Khi nào nên dùng Fragment? khi nào bạn cần thiết kế một ứng dụng mà bạn muốn nó có thể "thiên biến vạn hóa" tức là bỏ vào đâu cũng chạy được bất kể kích cỡ màn hình thiết bị, hoặc trạng tháo landscape or portraint.
    Như mình đã nói trên là Fragment từ API level 11 mới có, vậy nếu ta muốn viết một ứng dụng dùng Fragment mà có thể chạy trên các API trước thì sao? đừng lo đã có gói android.support.v4.app.Fragment giúp bạn rồi.
    3/ Ví dụ: Để hiểu rõ Fragment thì mình sẽ làm một demo rất phức tạp vì vậy yêu cầu các bạn chú ý theo dõi.
    Ở demo này mình sẽ có một màn hình có một cái button, bấm vào cái button sẽ xuất hiện một textview hiện lên chữ gì gì đó. Sao thấy phức tạp quá sợ chưa?=)) Let's go!!!
    Muốn dùng được Fragment thì đầu tiên bạn phải khai báo một đối tượng dùng để quản lý Fragment đó là FragmentManger.
    Cú pháp:
    Ở đây có 2 trường hợp nếu sử dụng từ API level 11 trở lên thì như sau: ​
    FragmentManager manger= getFragmentManager();
    Còn dùng trong các API thấp hơn thì:
    FragmentManager manger= getSupportFragmentmanger();
    Sau đó chúng ta cần tạo ra một đối tượng để quản lý việc thêm, xóa, sửa or thay thế Fragment đó là FragmentTransaction.
    Cú pháp:
    FragmentTransaction transaction= manager.beginTransaction();
    Sau đây là một số method thường dùng với Fragment:
    Thêm fragment:
    add(intcontainerViewId, Fragment fragment, String tag)
    Xóa fragment:
    remove(Fragment fragment)
    Thaythế fragment:
    replace(intcontainerViewId, Fragment fragment, String tag)
    Kếtthúc transaction:

    commit()
    Đặc biệt lưu ý method commit() luôn luôn phải có sau khi bạn dùng các method trên, và luôn luôn đặt nó ở cuối cùng.
    Còn một việc hết sưc quan trọng khác đó là nếu bạn muốn app của mình khi bấm nút back có thể quay về Fragment trước đó thì trước method commit() bạn hãy thêm vào method addToBackStack() đối số truyền vào method này thường là null có nghĩa là abajn muốn tất cả Fragment đều được đưa vào stack, còn ko thì bạn cứ điền thẳng vào đó cái tên của một FragmentTransaction mà bạn muốn lưu trữ trạng thái của nó để khi bấm back thì quay về nó.
    Nãy giờ chỉ nói code java giờ mới đến phần giao diện. Bạn cần tạo một giao diện cho Fragment như sau:

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:orientation="horizontal"
    
        android:layout_width="match_parent"
    
        android:layout_height="match_parent">
    
        <fragment android:name="com.example.news.ArticleListFragment"
    
                android:id="@+id/list"
    
                android:layout_weight="1"
    
                android:layout_width="0dp"
    
                android:layout_height="match_parent" />
    
        <fragment android:name="com.example.news.ArticleReaderFragment"
    
                android:id="@+id/viewer"
    
                android:layout_weight="2"
    
                android:layout_width="0dp"
    
                android:layout_height="match_parent" />
    
    </LinearLayout>
    Trong đó bạn để ý chỗ android:name="com.example.news.ArticleListFragment"android:id="@+id/list" các bạn có thể thay thế như sau: class= "com.example.news.ArticleListFragment"
    android:tag="list".
    Trên đây là mình chỉ bạn cách tạo Fragment bằng xml nhưng thường ta tạo chúng bằng code java sẽ VIP hơn. cụ thể như sau:

    Code:
    FragmentManager fragmentManager = getFragmentManager()
    
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    
    ExampleFragment fragment = new ExampleFragment();
    
    fragmentTransaction.add(R.id.fragment_container, fragment);
    
    fragmentTransaction.commit();
    
    
    Trong đó R.id.fragment_container là một cái layout container dùng để chứa layout của một Fragment còn biến fragment phía sau trong một số trường hợp thường thì đó là constructor của một Fragment. Theo như method add() mình đã hướng dẫn bên trên thì đáng lẽ có 3 tham số thì cái tham số thứ 3 ở đây chính là cái tag mà mình đã đề cập bên trên.
    Và cuối cùng đây là demo của mình chạy 100%, copy bỏ vô chạy chơi cho vui.:D
    MainActivity.java:
    Code:
    package dngb.bt.demofragment;
    
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends FragmentActivity {
    
        FragmentManager manager;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            manager= getSupportFragmentManager();
            Button btn=(Button) findViewById(R.id.btnShowFragment);
            btn.setOnClickListener(new OnClickListener() {
    
                public void onClick(View v) {
                    FragmentTransaction transaction= manager.beginTransaction();
                    transaction.add(R.id.container, new MyFragment(), "myFragment");
                    transaction.addToBackStack(null);
                    transaction.commit();
                }
            });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }
    
    MyFragment.java:
    Code:
    package dngb.bt.demofragment;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.View;
    import android.view.LayoutInflater;
    import android.view.ViewGroup;
    public class MyFragment extends Fragment{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    View view= inflater.inflate(R.layout.fragment, container, false);
    return view;
    }
    }
    activity_main.xml:
    Code:
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
       <Button
            android:id="@+id/btnShowFragment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="17dp"
            android:text="Button" />
       <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignLeft="@+id/btnShowFragment"
            android:layout_below="@+id/btnShowFragment"
            android:layout_marginTop="44dp" >
        </FrameLayout>
    
    </RelativeLayout>
    fragment.xml:

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:layout_width="match_parent"
    
        android:layout_height="match_parent"
    
        android:orientation="vertical" >
      
    <TextView
    
            android:id="@+id/textView1"
    
            android:layout_width="wrap_content"
    
            android:layout_height="wrap_content"
    
            android:text="Welcome here!"
    
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
    </LinearLayout>
    Xong rồi mừng quá, cuối cùng xin cảm ơn các bạn đã theo dõi topic này, sự thật thì mình viết văn ngu lắm nên đọc thấy nó cũng còn khó hiểu vì thế bạn nào ko hiểu điều gì kể các ở các bài hướng dẫn trước thì cứ lập topic đích thân mình sẽ hướng dẫn chi tiết.











     
    letuan195, nobita_F5 and sonpx like this.

Chia sẻ trang này

Loading...