FragmentとActivity間の通信(相互呼び出し方法)
18234 ワード
今日viewPagerでfragmentをネストするには、fragmentがactivityを呼び出す方法が必要で、activityがfragmentを呼び出す方法が必要で、しばらくはどうすればいいか分かりません.その後、ActivityにおいてインタフェースとHandlerを定義、インタフェースの役割はフラグメントにActivityの命令を受信させることであり、Handlerはフラグメントからの命令を受信するために使用され、Activityは操作を実行する.
次のようになります.
これがActivityのコードです.次のように2つの破片を書きます.
Fragment1:
この破片はそのActivityにこのインタフェースを実現させ、インタフェースの中の値をページに表示し、この破片の中のButtonをクリックしてActivityにメッセージを送信する.この中で私が送ったのは100です.
Fragment2:
これで終わります.今後のプロジェクトも破片を恐れず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(){
@Override
public 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;
}
}
}
};
@Override
protected 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);
}
@Override
public 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のコードです.次のように2つの破片を書きます.
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;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainActivity activity=(MainActivity) getActivity();
/**
* Activity Handler
*/
handler=activity.handler;
/**
*
*/
activity.setButtonClickedListener(new OnButtonClickedListener() {
@Override
public void onclicked(String s) {
/*
* Activity
*/
textView.setText(s);
button.setVisibility(View.VISIBLE);
}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.item1, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
textView=(TextView) getActivity().findViewById(R.id.textView1);
button=(Button) getActivity().findViewById(R.id.button2);
button.setOnClickListener(this);
}
@Override
public 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 {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.item2, null);
}
}
これで終わります.今後のプロジェクトも破片を恐れずActivityと通信した.