標籤:fragment 互動 通訊 activity 片段
大家好.Fragment現在越來越廣泛了,中文翻譯為片段,下面我就就片段代替了,當時Google出片段的原因是因為Android裝置螢幕大小不統一,片段出來了.用一套APP就可以解決平板跟手機上的UI問題.對於新手讓片段跟Activity互動很困難,因為片段是依附在Activity上面的,他們不是一個整體,好,廢話少說,讓我們看看到底如何讓片段跟Activity互動.
我是這樣的設計的,在Activity裡面一個Button,點擊這個Button讓下面的片段顯示一段檔案,當這段文字顯示出來以後片段裡面也有個Button,點擊片段裡面的這個Button讓Activity換個片段.
首先我先在Activity定義介面和一個Handler,介面的作用是讓片段接收Activity的指令,而Handler用於接收片段傳來的指令,Activity在執行操作.如下所示:
package com.example.fragmentactivity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentTransaction;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.FrameLayout;public class MainActivity extends FragmentActivity implements OnClickListener {private Button button1;private String fragmentName;private OnButtonClickedListener buttonClickedListener;/** * 定義一個Handler用於接收黃色片段給Activity發出來的指令 */public Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if(msg!=null){switch (msg.what) {case 100:/** * 接收到黃色片段發來的指令,Activity執行替換操作 */fragmentName=Fragment2.class.getName();replaceFragment(R.id.FrameLayout1, fragmentName);break;default:break;}}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button1=(Button) findViewById(R.id.button1);button1.setOnClickListener(this);/** * 載入黃色片段 */fragmentName=Fragment1.class.getName();replaceFragment(R.id.FrameLayout1, fragmentName);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button1:if(buttonClickedListener!=null){buttonClickedListener.onclicked("Activity:我不想要這個黃色片段了,點擊下面的按鈕給我換個綠色的片段");}break;default:break;}}/* * * 載入片段 */protected void replaceFragment(int viewResource, String fragmentName) {FragmentTransaction ft = getSupportFragmentManager().beginTransaction();Fragment fragment = Fragment.instantiate(this, fragmentName);ft.replace(viewResource, fragment);ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);ft.commit();getSupportFragmentManager().executePendingTransactions();}/** * 定義一個介面 * @author zqy * */public interface OnButtonClickedListener{/** * 裡面傳個值 * @param s */public void onclicked(String s);}/** * * @param buttonClickedListener * 寫一個對外公開的方法 */public void setButtonClickedListener(OnButtonClickedListener buttonClickedListener){this.buttonClickedListener=buttonClickedListener;}}這就是Activity裡面的代碼,我們在去寫兩個片段如下所示:
Fragment1:
package com.example.fragmentactivity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import com.example.fragmentactivity.MainActivity.OnButtonClickedListener;public class Fragment1 extends Fragment implements OnClickListener {private TextView textView;private Button button;private Handler handler;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MainActivity activity=(MainActivity) getActivity();/** * 得到Activity的Handler */handler=activity.handler;/** * 加監聽 */activity.setButtonClickedListener(new OnButtonClickedListener() {@Overridepublic void onclicked(String s) {/* * 顯示Activity傳來的內容 */textView.setText(s);button.setVisibility(View.VISIBLE);}});}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.item1, null);}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);textView=(TextView) getActivity().findViewById(R.id.textView1);button=(Button) getActivity().findViewById(R.id.button2);button.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button2:/** * 發送指令到Activity */handler.sendEmptyMessage(100);break;default:break;}}
這個片段讓它的Activity實現這個介面,在把介面裡面的值顯示到頁面上,在點擊這個片段裡面的Button給它的Activity發送一個訊息.這裡面我發的是100.
Fragment2:
package com.example.fragmentactivity;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class Fragment2 extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubreturn inflater.inflate(R.layout.item2, null);}}這就寫完了.以後的項目在也不怕片段跟Activity通訊了,下面來一張,UI比較難看,哈哈,不會的可以在下面留言,我會把Demo給你們傳到資源上,供你們下載,謝謝!
源碼下載,請點擊這裡
詳解Fragment跟Activity之間的通訊