在 viewpager 中的片段之间传递数据
Passing data beetwen fragments in viewpager
我有 Viewpager 和 2 个片段:CurrentWeatherFragment
和 ForecastFragment
。我需要将字符串从一个传递到另一个,我正在使用如下界面,但我不断收到 NullPointerException
,消息未正确传递...
public class CurrentWeatherFragment extends Fragment {
SendMessage SM
public void onCreateView(...) {
String Message = "Hello"
SM.sendData(Message);
}
interface SendMessage
{
public void sendData(String message);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
SM = (SendMessage) activity;
} catch(ClassCastException e) {
throw new ClassCastException("Musisz zaimplementowac metode sendData");
}
}
}
MainActivity.java
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
public class MainActivity extends FragmentActivity implements CurrentWeatherFragment.SendMessage {
ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//setting fragment view pager
viewPager = (ViewPager)findViewById(R.id.pager);
PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(pagerAdapter);
}
public void sendData (String message){
ForecastFragment FF = new ForecastFragment();
FF.getData(message);
}
}
ForecastFragment.java
public class ForecastFragment extends Fragment {
public View onCreateView(){
TextView txt = (TextView)v.findViewById(R.id.txt_forecast);
}
public void getData(String message){
txt.setText(message);
}
}
我已经在其他应用程序中成功使用了这个方法,我在一个应用程序中有 2 个片段 activity,我可以通过 ID 调用它们
public void sendData(String message) {
SecondFragment f2 = (SecondFragment)getFragmentManager().findFragmentById(R.id.F2);
f2.getData(message);
}
但是这里的 Fragments 没有 ID,我认为消息没有传递,因为我不使用 FragmentManager()
,但是如何在没有 ID 的 viewpager 中找到片段,任何 suggestion/ideas?
要在片段之间传递数据,您需要在对象构造函数中传递数据。
注意不要重写默认构造函数,而是创建一个静态方法 getInstance(String data)。
public static YourClass getInstance(String data)
{
YourClass object = new YourClass();
Bundle bundle = new Bundle();
bundle.putString(key, data);
object.setArguments(bundle);
return object;
}
然后就可以在fragment的onCreate方法中通过getArguments()获取数据
虽然有点老套,但您可以使用以下代码通过标签获取片段:
String tag = "android:switcher:" + R.id.pager + ":" + index;
Fragment f = getSupportFragmentManager().findFragmentByTag(tag);
其中 R.id.pager 是布局中 viewpager 的 ID,index 是 Viewpager 适配器中的位置(作为整数)。
我不能说这会永远有效,但目前对我有效。
我建议的替代方案是使用 LocalBroadcastManager 和 BroadcastReciver 在您的片段之间发送内部数据,尽管它需要更多的工作,但它有助于摆脱意大利面条代码的情况,您最终可能会发现自己在尝试引用直接碎片。
对于像我这样寻找片段以发送 viewpager 数据的其他用户
这是可行的解决方案:
将数据从片段发送到选项卡布局的视图分页器的片段:
在主要片段中:
对于选项卡布局,我使用了两个片段
1) BillDetailFragment 和
2) ClientDepMonFragment
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view= inflater.inflate(R.layout.fragment_detail, container, false);
// adding fragment and passing data to it
BillDetailFragment billDetailFragment=new BillDetailFragment();
Bundle bundle=new Bundle();
bundle.putString("mobile",mobile);
bundle.putInt("c_id",client_id);
bundle.putInt("server_id",server_id);
billDetailFragment.setArguments(bundle);
ClientDepMonFragment clientDepMonFragment=new ClientDepMonFragment();
Bundle bundle1=new Bundle();
bundle1.putString("mobile",mobile);
bundle1.putInt("c_id",client_id);
bundle1.putInt("server_id",server_id);
clientDepMonFragment.setArguments(bundle1);
tabLayout=(TabLayout)view.findViewById(R.id.detail_txn_tab_layout);
viewPager=(ViewPager)view.findViewById(R.id.detail_txn_viewpager);
dtViewPagerAdapter=new DtViewPagerAdapter(getChildFragmentManager(),DetailFragment.this);
dtViewPagerAdapter.addFragments(billDetailFragment,"Lending Money");
dtViewPagerAdapter.addFragments(clientDepMonFragment,"Deposited Money");
viewPager.setAdapter(dtViewPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
}
下面是如何从片段
访问该数据
BillDetailFragment:覆盖 onCreate 方法
private int client_id,server_id;
private String client_mobile;
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
client_mobile=getArguments().getString("mobile");
client_id=getArguments().getInt("c_id");
server_id=getArguments().getInt("server_id");
}
我有 Viewpager 和 2 个片段:CurrentWeatherFragment
和 ForecastFragment
。我需要将字符串从一个传递到另一个,我正在使用如下界面,但我不断收到 NullPointerException
,消息未正确传递...
public class CurrentWeatherFragment extends Fragment {
SendMessage SM
public void onCreateView(...) {
String Message = "Hello"
SM.sendData(Message);
}
interface SendMessage
{
public void sendData(String message);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
SM = (SendMessage) activity;
} catch(ClassCastException e) {
throw new ClassCastException("Musisz zaimplementowac metode sendData");
}
}
}
MainActivity.java
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
public class MainActivity extends FragmentActivity implements CurrentWeatherFragment.SendMessage {
ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//setting fragment view pager
viewPager = (ViewPager)findViewById(R.id.pager);
PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(pagerAdapter);
}
public void sendData (String message){
ForecastFragment FF = new ForecastFragment();
FF.getData(message);
}
}
ForecastFragment.java
public class ForecastFragment extends Fragment {
public View onCreateView(){
TextView txt = (TextView)v.findViewById(R.id.txt_forecast);
}
public void getData(String message){
txt.setText(message);
}
}
我已经在其他应用程序中成功使用了这个方法,我在一个应用程序中有 2 个片段 activity,我可以通过 ID 调用它们
public void sendData(String message) {
SecondFragment f2 = (SecondFragment)getFragmentManager().findFragmentById(R.id.F2);
f2.getData(message);
}
但是这里的 Fragments 没有 ID,我认为消息没有传递,因为我不使用 FragmentManager()
,但是如何在没有 ID 的 viewpager 中找到片段,任何 suggestion/ideas?
要在片段之间传递数据,您需要在对象构造函数中传递数据。
注意不要重写默认构造函数,而是创建一个静态方法 getInstance(String data)。
public static YourClass getInstance(String data)
{
YourClass object = new YourClass();
Bundle bundle = new Bundle();
bundle.putString(key, data);
object.setArguments(bundle);
return object;
}
然后就可以在fragment的onCreate方法中通过getArguments()获取数据
虽然有点老套,但您可以使用以下代码通过标签获取片段:
String tag = "android:switcher:" + R.id.pager + ":" + index;
Fragment f = getSupportFragmentManager().findFragmentByTag(tag);
其中 R.id.pager 是布局中 viewpager 的 ID,index 是 Viewpager 适配器中的位置(作为整数)。 我不能说这会永远有效,但目前对我有效。
我建议的替代方案是使用 LocalBroadcastManager 和 BroadcastReciver 在您的片段之间发送内部数据,尽管它需要更多的工作,但它有助于摆脱意大利面条代码的情况,您最终可能会发现自己在尝试引用直接碎片。
对于像我这样寻找片段以发送 viewpager 数据的其他用户
这是可行的解决方案:
将数据从片段发送到选项卡布局的视图分页器的片段:
在主要片段中:
对于选项卡布局,我使用了两个片段
1) BillDetailFragment 和
2) ClientDepMonFragment
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view= inflater.inflate(R.layout.fragment_detail, container, false);
// adding fragment and passing data to it
BillDetailFragment billDetailFragment=new BillDetailFragment();
Bundle bundle=new Bundle();
bundle.putString("mobile",mobile);
bundle.putInt("c_id",client_id);
bundle.putInt("server_id",server_id);
billDetailFragment.setArguments(bundle);
ClientDepMonFragment clientDepMonFragment=new ClientDepMonFragment();
Bundle bundle1=new Bundle();
bundle1.putString("mobile",mobile);
bundle1.putInt("c_id",client_id);
bundle1.putInt("server_id",server_id);
clientDepMonFragment.setArguments(bundle1);
tabLayout=(TabLayout)view.findViewById(R.id.detail_txn_tab_layout);
viewPager=(ViewPager)view.findViewById(R.id.detail_txn_viewpager);
dtViewPagerAdapter=new DtViewPagerAdapter(getChildFragmentManager(),DetailFragment.this);
dtViewPagerAdapter.addFragments(billDetailFragment,"Lending Money");
dtViewPagerAdapter.addFragments(clientDepMonFragment,"Deposited Money");
viewPager.setAdapter(dtViewPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
}
下面是如何从片段
访问该数据BillDetailFragment:覆盖 onCreate 方法
private int client_id,server_id;
private String client_mobile;
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
client_mobile=getArguments().getString("mobile");
client_id=getArguments().getInt("c_id");
server_id=getArguments().getInt("server_id");
}