簡體   English   中英

從父活動訪問選項卡式片段方法?

[英]Accessing a tabbed fragment method from the parent activity?

嗨(我是新來的,所以你必須原諒我)

我目前有一個選項卡式活動,其中MainActivity.java是父類,而Absences.javaNotices.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM