我需要将数据从Activity传递到Fragment。我知道可以使用Bundle,但是一旦我传递了数据,除非重新调用和创建Fragment,否则无法发送数据。
在我的Activity中,某些内容可能会更改,我需要通知我的Fragment这些更改,而不必重新创建Fragment。
在我的Activity中,某些内容可能会更改,我需要通知我的Fragment这些更改,而不必重新创建Fragment。
public class MainActivity extends AppCompatActivity {
DataFromActivityToFragment dataFromActivityToFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentA fr = new FragmentA();
FragmentManager fm = getFragmentManager();
dataFromActivityToFragment = (DataFromActivityToFragment) fr;
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
final Handler handler = new Handler();
final Runnable r = new Runnable() {
public void run() {
dataFromActivityToFragment.sendData("Hi");
}
};
handler.postDelayed(r, 5000);
}
public interface DataFromActivityToFragment {
void sendData(String data);
}
}
FragmentA.class
public class FragmentA extends Fragment implements MainActivity.DataFromActivityToFragment {
TextView text;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.content_main, null);
text = (TextView) rootView.findViewById(R.id.fragment_text);
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void sendData(String data) {
if(data != null)
text.setText(data);
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/fragment_place"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
content_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/fragment_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
在上面的例子中,我只是使用Runnable
来在创建fragment
后延迟5秒发送数据。
Fragment对象就像其他对象一样。与String类似,您可以调用字符串对象的方法,例如 str.charAt(0),str.toUpperCase() 等。只需在片段中创建一个函数,将您的代码放在其中,并与值一起调用该函数即可。
Inside Activity {
fragDemoObject.doWhatYouWant("this is passed as string object to fragment");
}
Inside FragmentDemo{
void doWhatYouWant(String input){
System.out.println(input);
// do what else you want to do with code
}
}
实际上,您的问题与以下内容无关:
我需要从活动传递数据到片段。我知道我可以使用bundle,但是一旦我传递了数据,我就不能再发送更多数据而不重新调用和创建fragment。
真正的问题是:
在我的活动中,某些事情可能会发生变化,我需要通知我的片段这些变化,而不必重新创建片段。
我该怎么做?
在这种情况下,我会将片段作为引用存储在活动中,并调用片段内的函数或接口实现。
像这样:
在 Activity 中:
SomeEventListener myFragment ;
yourFragmentCreationMethod(){
if(myFragment == null){
myFragment = new MyFragment(maybeParamsHere);
}
}
yourNotificationMethod(){
myFragment .onEventHappent(param);
}
// declare an interface: - separate file
public interface SomeEventListener
{
void onEventHappent(param);
}
// implement the interface in Fragment - separate file
public class MyFragment extends Fragment implements SomeEventListener{
// add a constructor what you like
public void onEventHappent(param){
/// ... your update
}
}
这个界面仅用于测试。
public void myFragmentDataFromActivity(int passedDataFromActivity) {
// do your stuff
}
在您的活动中传递整数值,比如100:
使用getSupportFragmentManager或getFragmentManager通过提供id/tag/position来获取MyFragment实例。然后调用MyFragment实例中的公共方法。
MyFragment myFragment = (MyFragment) getSupportFragmentManager.getFragmentById(id);
myFragment.myFragmentDataFromActivity(100);
getFragmentByTag(tag)
,getFragments().get(position)
代替getFragmentById(id)
来获取片段实例。
如果要在创建后通知带有一些数据的片段,可以使用某些通信器,或者您始终可以在创建时通过Bundle传递数据...例如:
public interface FragmentCommunicator {
void updateDataToFragment(List<Parcelable> data);
然后在你的片段中实现这个接口,并从活动中调用它,例如:
Fragment fragment = mSectionsPagerAdapter.getRegisteredFragment(i);
if (fragment instanceof FragmentCommunicator) {
FragmentCommunicator fragmentCommunicator = (FragmentCommunicator) fragment;
fragmentCommunicator.updateDataToFragment(data);
}`
这应该适用于您的情况...
在Activity中尝试这个
fragment=new PdfFragment();
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
Bundle bundle = new Bundle();
bundle.putString("pdf", Pdf);
bundle.putString("flag", "0");
fragment.setArguments(bundle);
fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack(null).commit();
}
并且在片段中
Pdf = getArguments().getString("pdf");
在片段中,您应该将方法声明为公共的以更新新数据。然后,您将通过片段实例调用该方法。例如,在获取新数据时,在您的活动中编写以下内容:
fragmentInstance.publicMethod(newData);
编程愉快!
class DataPersistance {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
private String name;
private String place;
private String type;
private static final DataPersistance ourInstance = new DataPersistance();
static DataPersistance getInstance() {
return ourInstance;
}
private DataPersistance() {
}
}
DataPersistance.getInstance().setName(mEditText.getText().toString());
String name = DataPersistance.getInstance().getName();