好的,按照谷歌的建议,即大部分电话应该通过活动进行,我决定从活动中调用datepickerdialog。这是由fragmentService类中的按钮单击触发的,我在其中为。
创建了一个接口datepickerdialog会加载,我会从用户输入中获取结果。但是,我面临的问题是如何从Activity中将数据返回到fragmentService。我可以从FragmentPagerAdapter成功获取片段的ID,但就是这样。
根据我搜索的内容,我找不到类似的例子。
请参阅以下代码。
public class MyPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public MyPagerAdapter(FragmentManager fm) {
super(fm);
this.fragments = new ArrayList<Fragment>();
// add to the arraylist all of the different fragments
fragments.add(new fragmentAboutCar());
fragments.add(new fragmentMPG());
fragments.add(new fragmentServicing());
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
// sets the title of each page
public CharSequence getPageTitle(int position) {
String title = null;
switch(position){
case 0:
title = "About Car";
break;
case 1:
title = "MPG";
break;
case 2:
title ="Servicing";
break;
case 3:
title = "Pink";
break;
}
return title;
}
}
public class MainActivity extends FragmentActivity implements fragmentServicing.callBack{
MyPagerAdapter pageAdapter;
ViewPager pager;
int id_dialog = 1;
int yr, day, month = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// gets the current date info
Calendar today = Calendar.getInstance();
yr = today.get(Calendar.YEAR);
month = today.get(Calendar.MONTH);
day = today.get(Calendar.DAY_OF_MONTH);
pageAdapter = new MyPagerAdapter(getSupportFragmentManager());
pager = (ViewPager)findViewById(R.id.myViewPager);
pager.setAdapter(pageAdapter);
pager.setCurrentItem(1);// middle of the items
}
// this is an override for when the dialog is created
protected Dialog onCreateDialog(int id)
{
switch(id)
{
// this will return a date picker dialog if 1 is passed
// could use another number for another dialog
case 1:
// passes it the current date
return new DatePickerDialog(this, mDateSetListener, yr, month, day);
}
return null;
}
// this returns the date back that has been selected by the user
private DatePickerDialog.OnDateSetListener mDateSetListener =
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
yr = year;
month = monthOfYear;
day = dayOfMonth;
Log.d("date selected", "year "+ yr+ " month " +month+" day "+day);
// gets a reference to the fragment
fragmentServicing service = (fragmentServicing)
getSupportFragmentManager().findFragmentById(R.layout.fragment_servicing);
if (service != null) {
// Call a method in the fragmentServicing to update its content
service.setDateService(yr, month, day);
}
else{
int result = pager.getId();
Log.d("null", "reading NULL");
// gets the current fragment identification
int id = pager.getCurrentItem();
Fragment f = pageAdapter.getItem(id);
//fragmentServicing f = new fragmentServicing();
//f.setDateService(1991, 02, 14);
Log.d("id", "THE ID IS "+id);
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.about:
Log.d("button1", "Plus button pressed");
break;
case R.id.button2:
Log.d("button2", "Minus button pressed");
break;
default:
break;
}
return true;
}
@Override
// this is from the servicing fragment
public void onItemSelected(String id) {
Log.d("from cooler", id);
showDialog(1);
}
}
public class fragmentServicing extends Fragment {
callBack mCallBack;
Button mot;
Button servicing;
Button tax;
EditText txtService;
final int Date_Dialog_ID=0;
int cDay,cMonth,cYear; // this is the instances of the current date
Calendar cDate;
int sDay,sMonth,sYear; // this is the instances of the entered date
// interfacing back to activity
public interface callBack
{
public void onItemSelected(String id);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallBack = (callBack) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
public void setDateService(int year, int month, int day)
{
txtService.setText(Integer.toString(year));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_servicing, container, false);
txtService = (EditText) view.findViewById(R.id.txtServiceDate);
mot = (Button) view.findViewById(R.id.buttonMOT);
servicing = (Button) view.findViewById(R.id.buttonService);
servicing.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// this will then pass back to the activity the string hello
mCallBack.onItemSelected("hello");
}
});
mot.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDatePicker();
Log.d("datePressed", "Pressed the date");
}
private void showDatePicker() {
DatePickerFragment date = new DatePickerFragment();
Calendar calender = Calendar.getInstance();
// TODO Auto-generated method stub
}
});
return view;
}
}
答案 0 :(得分:0)
我遇到了同样的问题。我相信谷歌正在引起一些心痛,因为他们总是通过主要活动与片段进行沟通而得到了一些回应。
对于大多数情况都是如此,但对于对话框弹出窗口并不严格。似乎没有充分的理由通过所有这些额外的长度来进行短暂的对话,例如数字/日期选择器。
我的建议 - 从您的片段中启动对话框片段,您的所有麻烦都将消失。
对于其他片段到片段的通信,请遵循指南。