有很多文章教导我们如何将数据从片段传递到片段,但大多数文章或问题已经在其第一个片段中实现了OnClickListener,它们将值传递给另一个片段.
但是我的情况是从两个片段传递数据,没有任何按钮单击,最后通过点击最后一个片段中的按钮将它们保存在不同的表中.我能做些什么来实现这一点?
流是信息>> WorkForce>> WorkDetailsTable,并通过一个按钮单击将它们保存到不同的表.
我已经尝试使用它,但我在sqlite中获得NULL值.我想我很想念,但不知道.请帮助我…我被困在这里两天以上…谢谢
Tab.java
public class Tab extends ActionBarActivity implements ActionBar.TabListener { ViewPager Tab; TabPagerAdapter TabAdapter; ActionBar actionBar; public static String name = null; public static String subContractors = null; // will be used for data communication public static Force force_bean;; public static Info info_bean; public static Force getForce(){ return force_bean; } public static void setForce(Force force){ force_bean=force; } public static Info getInfo(){ return info_bean; } public static void setInfo(Info info){ info_bean=info; } final Activity mActivity = (Activity) this; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tab1); info_bean = new Info(); force_bean = new Force(); TabAdapter = new TabPagerAdapter(getSupportFragmentManager()); Tab = (ViewPager) findViewById(R.id.pager); Tab.setOnPageChangeListener( new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar = ((AppCompatActivity) mActivity).getSupportActionBar(); actionBar.setSelectedNavigationItem(position); } }); Tab.setAdapter(TabAdapter); actionBar = ((AppCompatActivity) mActivity).getSupportActionBar(); //Enable Tabs on Action Bar actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); //Add New Tabs actionBar.addTab(actionBar.newTab().setText("Information").setTabListener(this)); actionBar.addTab(actionBar.newTab().setText("Work Force").setTabListener(this)); actionBar.addTab(actionBar.newTab().setText("Work Details").setTabListener(this)); } @Override public void onTabSelected(ActionBar.Tab tab,android.support.v4.app.FragmentTransaction ft) { } @Override public void onTabUnselected(ActionBar.Tab tab,android.support.v4.app.FragmentTransaction ft) { } @Override public void onTabReselected(ActionBar.Tab tab,android.support.v4.app.FragmentTransaction ft) { } }
TabPagerAdapter.java
public class TabPagerAdapter extends FragmentStatePagerAdapter { public TabPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { switch (i) { case 0: return Information.newInstance("name"); case 1: return WorkForce.newInstance("SubCon"); case 2: return WorkDetailsTable.newInstance(); } return null ; } @Override public int getCount() { return 3; //No of Tabs you can give your number of tabs }
Informmation.java
public class Information extends Fragment implements View.OnClickListener { private Spinner spinner,spinner2,spinner3; private static String a; public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { super.onCreate(savedInstanceState); View info = inflater.inflate(R.layout.information,container,false); dialog = new DateDialog(); spinner = (Spinner)info.findViewById(R.id.spinner); addItemsOnSpinner(); a= spinner.getSelectedItem().toString(); return info; } public static Information newInstance(String a) { Information fragment=new Information(); Bundle bundle=new Bundle(); bundle.putString("a",a); fragment.setArguments(bundle); return fragment; } public void addItemsOnSpinner() { List<String> list = new ArrayList<String>(); list.add("1 "); list.add("2"); ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_dropdown_item,list); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); }
WorkForce.java
public class WorkForce extends Fragment { private static EditText txt1; private static String subCon; public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { super.onCreate(savedInstanceState); View work = inflater.inflate(R.layout.workforce,false); txt1 = (EditText) work.findViewById(R.id.editText); subCon = txt1.getText().toString(); return work; } public static WorkForce newInstance(String subCon) { WorkForce f = new WorkForce(); Bundle bundle = new Bundle(); bundle.putString("subCon",subCon); f.setArguments(bundle); return f; } }
WorkDetails.java
private com.example.project.project.API.InfoAPI ts; private com.example.project.project.API.WorkDetailsAPI WD; private com.example.project.project.API.WorkForceAPI WF; public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { super.onCreate(savedInstanceState); View workDetails = inflater.inflate(R.layout.tableworkdetails,false); getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); spinnerTra = (Spinner) workDetails.findViewById(R.id.spinner6); addItemsOnSpinner(); Button btn1 = (Button)workDetails.findViewById(R.id.button2); WD = new com.example.project.project.API.WorkDetailsAPI(getActivity()); ts = new com.example.project.project.API.InfoAPI(getActivity()); WF = new com.example.project.project.API.WorkForceAPI(getActivity()); a1 = spinnerTra.getSelectedItem().toString(); Bundle bundle = new Bundle(); final String name = bundle.getString("a"); final String subContractors = bundle.getString("subCon"); btn1.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { add(name,subContractors); } }); return workDetails; } public void add(String name,String subContractors) { Toast.makeText(getActivity(),+name+subContractors,Toast.LENGTH_SHORT).show(); ts.insertTimeSheet(name); WF.insertWorkForce(subContractors); }
注意:我的情况是从两个片段传递数据,最后通过单击最后一个片段中的按钮将它们保存在不同的表中.
解决方法
所以在现实中,你的问题是如何在取消选择时将信息从片段中取出,并在选择时将其从片段中获取.
在最简单的级别,我建议您的活动保存所有信息的“主”副本,并将其传递到/从您的选项卡寻呼机适配器中的每个片段获取.
您将需要某种“域”对象来保存您需要收集的所有信息.每个标签只会更新其关心的信息位.
public class WorkData { string information; string subCon; ... etc.. }
您添加一个实例以将主副本保存到“选项卡”活动中:
public class Tab extends ActionBarActivity implements ActionBar.TabListener { ... WorkData workData = new WorkData(); ...
然后我会建议一个简单的界面,每个“标签”片段实现;就像是:
public interface DataUpdate { void setData(WorkData data); WorkData getData(); }
您的每个标签片段将实现此接口,根据需要更新WorkData.
public class WorkForce extends Fragment implements DataUpdate { ... private WorkData workData; // this fragment's "copy" of the data ... @Override public WorkData getData() { this.workData.subCon = this.subCon; // Assuming subcon has been updated.. else use txt1.getText(); return this.workData; } @Override public void setData(WorkData workData) { this.workData = workData; // Update this page's views with the workData... // This assumes the fragment has already been created and txt1 is set to a view txt1.setText(workData.subCon); this.subCon = workData.subCon; // Actually could just use subCon in workData,but be aware that workData actually points to the Activity's copy (kinda makes getdata redundant.. but I like symmetry and couldn't be bothered making lots of copies of the object). }
那么你只需要添加代码来将数据向前和向后传递..在你的“Tab”活动中看起来像…
@Override public void onTabSelected(ActionBar.Tab tab,android.support.v4.app.FragmentTransaction ft) { int position = tab.getPosition(); DataUpdate dataUpdate = (DataUpdate) TabAdapter.getItem(position); // Pass the master workdata to the selected fragment dataUpdate.setData(this.workData); } @Override public void onTabUnselected(ActionBar.Tab tab,android.support.v4.app.FragmentTransaction ft) { int position = tab.getPosition(); DataUpdate dataUpdate = (DataUpdate) TabAdapter.getItem(position); // Update the master workdata from the unselected fragment this.workData = dataUpdate.getData(); } @Override public void onTabReselected(ActionBar.Tab tab,android.support.v4.app.FragmentTransaction ft) { // This might be pointless,but we'll do it anyway.. int position = tab.getPosition(); DataUpdate dataUpdate = (DataUpdate) TabAdapter.getItem(position); // Pass the master workdata to the selected fragment dataUpdate.setData(this.workData); }
这里要注意的一个重要事情是,您的TabPagerAdapter将在每次调用getItem()..时创建一个新的片段,这意味着我们永远不会得到任何更新,因为每次尝试获取片段时,它返回一个新的空的片段.我们需要改变这一点,使得片段在第一次被请求时仍然创建,但只创建一次,这样我们不会继续抛弃我们的工作.
public class TabPagerAdapter extends FragmentStatePagerAdapter { private static final int NUMBER_OF_TABS = 3; private Fragment[] tabList = new Fragment[NUMBER_OF_TABS]; public TabPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { if (tabList[i] != null) { // Return a tab we created earlier.. return tabList[i]; } else { switch (i) { case 0: tabList[0] = Information.newInstance("name"); return tabList[0]; case 1: tabList[1] = WorkForce.newInstance("SubCon"); return tabList[1]; case 2: tabList[2] = WorkDetailsTable.newInstance(); return tabList[2]; } } return null ; } @Override public int getCount() { return NUMBER_OF_TABS; }
希望这可以帮助.祝你好运 :-)