本节再说一个Activity和Fragment之间通信的例子,系统有以下功能:在主activity下方有三个按钮,分别是send、record、common msg。当单击按钮时,来切换上方的fragment,用以显示不同的内容。

Fragment进阶1——Fragment与Activity之间的通信与切换_android


当单击send按钮时,从MainActivity中把EditText中的值传到Fragment中,然后把Fragment动态的显示在MainActivity中。 

所用的知识点:

1.从MainActivity中把EditText中的值传到fragment中。

2.Fragment动态的显示在MainActivity中。



FragmentSend.java文件很简单,看一下布局文件


<?xml version="1.0" encoding="utf-8"?>
 
  
<RelativeLayout 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/edit_fragment_send_msg"
 
  
        android:layout_width="match_parent"
 
  
        android:layout_height="wrap_content"
 
  
        android:layout_alignParentLeft="true"
 
  
        android:layout_alignParentRight="true"
 
  
        android:layout_alignParentTop="true" >
 
  
    </TextView>
 
  

 
  
</RelativeLayout>


在MainActivity中写点击事件



private OnClickListener sendListener = new OnClickListener() {
 
  

 
  
        @Override
 
  
        public void onClick(View v) {
 
  

 
  
            // TODO Auto-generated method stub
 
  

 
  
            // 获取fragment中的text控件,可以在MainActivity中直接获取fragment中的控件
 
  
            TextView showView = (TextView) findViewById(R.id.edit_fragment_send_msg);
 
  

 
  
            // 得到EditText中的内容
 
  
            String message = mEditText.getText().toString();
 
  

 
  
            mStringBuffer = mStringBuffer.append(message).append("\n");
 
  

 
  
            String text = "";
 
  

 
  
            // 防止字符过长
 
  
            if (mStringBuffer.length() > 100) {
 
  
                text = mStringBuffer.substring(mStringBuffer.length() - 100,
 
  
                        mStringBuffer.length() - 1).toString();
 
  
            } else {
 
  
                text = mStringBuffer.toString();
 
  
            }
 
  
            showView.setText(text);
 
  

 
  
            // 将获取的值放置到intent中,方便以后再fragment中获取
 
  
            getIntent().putExtra("str", mStringBuffer.toString());
 
  

 
  
        }
 
  
    };


当单击record按钮时,获取到前面所有发送的内容。所用到的知识点:

1.如何获取MainActivity中的数据(刚才发送的数据放在MainActivity中的字符缓存中)

2.从一个fragment切换到另一个fragment中。

继续在MainActivity中写一个点击事件



private OnClickListener recordListener = new OnClickListener() {
 
  

 
  
        @Override
 
  
        public void onClick(View v) {
 
  

 
  
            // TODO Auto-generated method stub
 
  

 
  
            FragmentRecord fragmentRecord = new FragmentRecord();
 
  
            FragmentTransaction fragmentTransaction = mFragmentManager
 
  
                    .beginTransaction();
 
  

 
  
            fragmentTransaction.replace(R.id.framelayout_fragment_main,
 
  
                    fragmentRecord);
 
  

 
  
            fragmentTransaction.addToBackStack(null);
 
  

 
  
            fragmentTransaction.commit();
 
  

 
  
        }
 
  

 
   
  
    };


当单击common msg按钮时会弹出一个列表,用户点击列表选项会将字符值返回到主EditText上。

所用到的知识点:

1.利用ListView控件显示数据

2.从一个fragment切换到另一个fragment中

3.fragment把值传递到MainActivity中





同样在MainActivity中写一个点击事件


private OnClickListener commonListener = new OnClickListener() {
 
  

 
  
        @Override
 
  
        public void onClick(View v) {
 
  

 
  
            // TODO Auto-generated method stub
 
  

 
  
            FragmentCommon fragmentCommon = new FragmentCommon();
 
  
            FragmentTransaction fragmentTransaction = mFragmentManager
 
  
                    .beginTransaction();
 
  

 
  
            fragmentTransaction.replace(R.id.framelayout_fragment_main,
 
  
                    fragmentCommon);
 
  

 
  
            fragmentTransaction.addToBackStack(null);
 
  

 
  
            fragmentTransaction.commit();
 
  

 
  
        }
 
  

 
  
    };

现在补齐MainActivity类文件




public class MainActivity extends Activity {
 
  

 
  
    private EditText mEditText;
 
  
    private FragmentManager mFragmentManager;
 
  
    private FragmentTransaction mFragmentTransaction;
 
  
    private Button mButtonSend;
 
  
    private Button mButtonRecord;
 
  
    private Button mButtonCommon;
 
  
    private StringBuffer mStringBuffer;
 
  
    String TAG = "tag";
 
  

 
  
    @Override
 
  
    protected void onCreate(Bundle savedInstanceState) {
 
  
        super.onCreate(savedInstanceState);
 
  
        requestWindowFeature(Window.FEATURE_NO_TITLE);
 
  
        // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
 
  
        // WindowManager.LayoutParams.FLAG_FULLSCREEN);
 
  
        setContentView(R.layout.activity_main);
 
  
        mStringBuffer = new StringBuffer();
 
  
        mButtonSend = (Button) findViewById(R.id.btn_main_send);
 
  
        mButtonRecord = (Button) findViewById(R.id.btn_main_record);
 
  
        mButtonCommon = (Button) findViewById(R.id.btn_main_common);
 
  
        mEditText = (EditText) findViewById(R.id.edit_main_msg);
 
  
        mButtonSend.setOnClickListener(sendListener);
 
  
        mButtonRecord.setOnClickListener(recordListener);
 
  
        mButtonCommon.setOnClickListener(commonListener);
 
  
        mFragmentManager = getFragmentManager();
 
  
        mFragmentTransaction = mFragmentManager.beginTransaction();
 
  
        //必须先初始化一个fragment,防止获取不到对应fragment中控件
 
  
        if (savedInstanceState == null) {
 
  
            FragmentSend fragmentSend = new FragmentSend();
 
  
            mFragmentTransaction.add(R.id.framelayout_fragment_main,
 
  
                    fragmentSend, "SEND");
 
  
            // 加入到后台栈中
 
  
            mFragmentTransaction.addToBackStack(null);
 
  
            mFragmentTransaction.commit();
 
  
        }
 
  

 
  
    }



最后的实现结果如下:

Fragment进阶1——Fragment与Activity之间的通信与切换_android开发_02



源代码

参考:


http://www.th7.cn/Program/Android/201405/198432.shtml

http://dwtedx.com/itshare_296.html