UIとコーダのカプセル化-Fragment(4)

7739 ワード

この節では主に2つの知識点FragmentとActivityの間の相互作用Fragmentのコールバックメカニズムを復習する
一、FragmentとActivityの相互作用
FragmentとActivityの間にはFragmentがある.setArgumentメソッドは、パラメータ値をFragmentに伝達する、Fragmentを通過する.getArgumentメソッドは、これらの伝達されたパラメータ値を取得します.
転送されるデータは、Bundle bundle形式でキー値ペアです.なお、本例のonClick_ShowArgumentメソッドは、MyFragmentクラスではなくFragmentArgumentAtivityクラスに配置する必要があるMyFragmentのボタンをクリックするイベントメソッドです.
package com.example.fragmentargument_01;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class FragmentArgumentActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_fragment_argument);
	}

	
		@SuppressLint("NewApi")
		public void onClick_sendData(View view){
			MyFragment fragment = new MyFragment();
			Bundle budle = new Bundle();
			budle.putString("name", "hello fragment");
			fragment.setArguments(budle);
			FragmentManager fragmentManager = getFragmentManager();
			FragmentTransaction transaction =fragmentManager.beginTransaction();
			transaction.add(R.id.main_container, fragment, "fragment");
			transaction.commit();
			Toast.makeText(this, " ", Toast.LENGTH_SHORT);
		}
		
		@SuppressLint("NewApi")
		public void onClick_ShowArgument(View view){
			EditText editText = (EditText)findViewById(R.id.editText);
			String name = getFragmentManager().findFragmentByTag("fragment").getArguments().getString("name");
			editText.setText(name);
		}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.fragment_argument, menu);
		return true;
	}

}
package com.example.fragmentargument_01;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

@SuppressLint("NewApi")
public class MyFragment extends Fragment{

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View view = inflater.inflate(R.layout.myfragment, container, false);
		return view;
	}
	
	@Override
	public void onDestroyView()
	{
		
		Log.d("name", getArguments().getString("name"));
		super.onDestroyView();
	}  
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    
   <EditText 
       android:id="@+id/editText"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text=" "
       />
   
   <Button
       android:id="@+id/button_02"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text=" "
        android:onClick="onClick_ShowArgument"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    
        <Button 
        android:id="@+id/button_01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text=" Fragment"
        android:onClick="onClick_sendData"
        />
   <FrameLayout 
       android:id="@+id/main_container"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       ></FrameLayout>
</LinearLayout>

レイアウトのbuttonに注意すればいいです.簡単なインタラクションプロセスが完了しました.
二、Fragmentのコールバックメカニズム
本例の2つのFragment:TopFragmentとBottomFragmentのうち、TopFragmentにボタンがある場合Button.ButtomFragmentにはEditTextがあり、ButtonをクリックしてEditTextに情報を表示する必要があります.その時、これは簡単ではないと思いました.TopFragmentでEditTextを手に入れるのは簡単なことだと思います.もちろん私が考えているのも間違いありませんが、技術的には実現できますが、Android SDKの初心はここではありません.これまでのやり方は2つのFragmentを深く縛ることに相当し、独立性を維持することはできませんでした.android SDKがFragmentを提供する目的は主にパッケージ化し、できるだけ独立性を維持することです.
通常の方法は、EditTextを操作する権利をホストウィンドウに渡して処理するか、EditTextに対する操作をBottomFragmentに直接カプセル化してからウィンドウ内で呼び出せばよい.
次は部分コードです
package mobile.android.fragment.callback;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

public class TopFragment extends Fragment implements OnClickListener
{
	private OnTopButtonClickedListener listener;
	//     
	public interface OnTopButtonClickedListener
	{
		
		public void onClick(String name);
	}

	@Override
	public void onAttach(Activity activity)
	{
		if(getActivity() instanceof OnTopButtonClickedListener)
		{
			listener = (OnTopButtonClickedListener)getActivity();
		}
		super.onAttach(activity);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState)
	{
		View view = inflater.inflate(R.layout.top_fragment, null);
		view.setOnClickListener(this);
		return view;
	}
	
	public void onClick(View view)
	{
		if(listener != null)
		{
			listener.onClick("Top Fragment Demo");
		}
	}

}

                                                                                             TopFragment.java
package mobile.android.fragment.callback;

import mobile.android.fragment.callback.TopFragment.OnTopButtonClickedListener;
import android.app.Activity;
import android.os.Bundle;

public class FragmentCallbackActivity extends Activity implements
		OnTopButtonClickedListener
{

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_fragment_callback);
	}

	@Override
	public void onClick(String name)
	{
		BottomFragment fragment = (BottomFragment) getFragmentManager()
				.findFragmentByTag("bottom_fragment");
		fragment.updateText("onClick:" + name);

	}

}

                                                                                   FragmentCallbackActivity.java
package mobile.android.fragment.callback;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

public class BottomFragment extends Fragment
{

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState)
	{
		View view = inflater
				.inflate(R.layout.bottom_fragment, container, false);
		
		return view;
	}
	   
	public void updateText(String value)
	{
		EditText editText = (EditText)getView();
		editText.setText(value);
	}

}

                                                                         BottomFragment.java