[英]Accessing a tabbed fragment method from the parent activity?
嗨(我是新來的,所以你必須原諒我)
我目前有一個選項卡式活動,其中MainActivity.java
是父類,而Absences.java
和Notices.java
是片段。 我在MainActivity
中有一個日期選擇器片段,當我點擊選項菜單按鈕時,該片段就會運行。
成功選擇日期后,我想將信息傳遞到“缺勤”片段中的方法中。 但是,我真的在如何實現這一部分上很掙扎。
我所做的研究似乎表明這是解決方案:
Absences fragment= (Absences) getSupportFragmentManager().findFragmentById(R.id.Absences);
((Absences)fragment).updateAbsences();
但是,無法從靜態上下文中引用getSupportFragmentManager()
而且我似乎找不到我的Fragment的ID。
經過更多的研究之后,似乎發現此方法不適用於選項卡式活動,因此我對此感到茫然。
有人可以指出正確的方向嗎? -我已經為此工作了很長時間!
SectionsPageAdapter類
Fragment one, two;
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
switch (position) {
case 0:
if(one==null){
one = new Absences();
}
return one;
case 1:
if(two==null){
two = new Notices();
}
return two;
}
return null;
}
@Override
public int getCount() {
// Show 3 total pages.
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "ABSENCES";
case 1:
return "NOTICES";
}
return null;
}
}
onOptionsItemSelected
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.calendar) {
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");
}
return super.onOptionsItemSelected(item);
}
DatePickerFragment
public static class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, year, month, day);
dialog.getDatePicker().setMaxDate(c.getTimeInMillis());
dialog.setTitle("");
return dialog;
}
public void onDateSet(DatePicker view, int year, int month, int day) {
Absences fragment= (Absences) getSupportFragmentManager().findFragmentById(R.id.Absences);
((Absences)fragment).updateAbsences();
}
}
- 編輯 -
根據以下建議更新了代碼
MainActivity內部的方法
public void onDatePicked() {
Absences fragment = (Absences) getSupportFragmentManager().findFragmentById(R.id.absences);
fragment.updateAbsences();
}
新的DatePickerFragment類
package com.alexwoohouse.heartofengland;
import android.annotation.TargetApi;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.widget.DatePicker;
import java.util.Date;
public class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
public interface OnDatePickedListener {
void onDatePicked(); //This method seems to be greyed out!
}
@TargetApi(Build.VERSION_CODES.N)
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, year, month, day);
dialog.getDatePicker().setMaxDate(c.getTimeInMillis());
dialog.setTitle("");
return dialog;
}
@TargetApi(Build.VERSION_CODES.N)
public void onDateSet(DatePicker view, int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, day);
}
}
這是我的建議。
首先,將DatePickerFragment
移出為其自己的頂級類。 我不知道您是否有充分的理由將其作為靜態內部類,但是您可能不需要。
現在,通常,您具有片段(對話或其他方式)傳遞信息的方式是通過接口回調。 因此,您無需像嘗試那樣直接訪問當前活動的片段管理器,而是使用必須發送的數據調用回調。 有關詳細信息和示例代碼,請參見android文檔 ,但基本上,您需要在DatePickerFragment
中定義一個接口,該接口將在選擇日期時被調用:
public interface OnDatePickedListener {
void onDatePicked(Date date);
}
將片段附加到活動后,將其另存為片段的當前偵聽器實例。 在對話框片段中選擇日期時,將調用偵聽器的onDatePicked
方法。
然后,您的活動將實現此接口,以委托給您要更新的片段:
public class MainActivity implements DatePickerFragment.OnDatePickedListner {
@Override
public void onDatePicked(Date date) {
Absences fragment = (Absences) getSupportFragmentManager().findFragmentById(R.id.Absences);
fragment.updateAbsences();
}
}
這樣做的主要好處是關注點分離。 您的對話框片段對擁有它的活動一無所知。 它只知道它必須向實現接口的任何人報告選定的日期。 然后,您可以在您選擇日期的任何其他活動中顯示此對話框片段,只要它們還實現了正確的界面即可。
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.