UIとコーダのカプセル化-Fragment(4)
7739 ワード
この節では主に2つの知識点FragmentとActivityの間の相互作用Fragmentのコールバックメカニズムを復習する
一、FragmentとActivityの相互作用
FragmentとActivityの間にはFragmentがある.setArgumentメソッドは、パラメータ値をFragmentに伝達する、Fragmentを通過する.getArgumentメソッドは、これらの伝達されたパラメータ値を取得します.
転送されるデータは、Bundle bundle形式でキー値ペアです.なお、本例のonClick_ShowArgumentメソッドは、MyFragmentクラスではなくFragmentArgumentAtivityクラスに配置する必要があるMyFragmentのボタンをクリックするイベントメソッドです.
レイアウトのbuttonに注意すればいいです.簡単なインタラクションプロセスが完了しました.
二、Fragmentのコールバックメカニズム
本例の2つのFragment:TopFragmentとBottomFragmentのうち、TopFragmentにボタンがある場合Button.ButtomFragmentにはEditTextがあり、ButtonをクリックしてEditTextに情報を表示する必要があります.その時、これは簡単ではないと思いました.TopFragmentでEditTextを手に入れるのは簡単なことだと思います.もちろん私が考えているのも間違いありませんが、技術的には実現できますが、Android SDKの初心はここではありません.これまでのやり方は2つのFragmentを深く縛ることに相当し、独立性を維持することはできませんでした.android SDKがFragmentを提供する目的は主にパッケージ化し、できるだけ独立性を維持することです.
通常の方法は、EditTextを操作する権利をホストウィンドウに渡して処理するか、EditTextに対する操作をBottomFragmentに直接カプセル化してからウィンドウ内で呼び出せばよい.
次は部分コードです
TopFragment.java
FragmentCallbackActivity.java
BottomFragment.java
一、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