【问题标题】:Correctly to call function in fragment tab from parent fragment with FragmentPagerAdapter使用 FragmentPagerAdapter 从父片段正确调用片段选项卡中的函数
【发布时间】:2015-09-16 17:43:08
【问题描述】:

我有使用FragmentPagerAdapter 创建的标签:

public class SectionsPagerAdapter extends FragmentPagerAdapter {
static final int PAGE_COUNT = 2;

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {
    switch (index) {
    case 0:
        return new SessionDetails();
    case 1:
        return new SessionScoreTable();
    }
    return null;
}

@Override
public int getCount() {
    return PAGE_COUNT;
}}

我需要通过单击另一个选项卡上的按钮来更新一个选项卡。

FragmentActivity 有:

fragSessionDetails = (SessionDetails) mSectionsPagerAdapter.getItem(0);

并且有function:

public void setSessionCompleted(){
    fragSessionDetails.processSessionCompleted();
}

从另一个选项卡 (SessionScoreTable) 调用。

SessionDetails标签有功能:

    public void processSessionCompleted(){
    Log.d(TAG,"processSessionCompleted" );
        bSave.setEnabled(false);
        }

bSave 是按钮。

在日志中我有 NullPointerException 在行 - bSave.setEnabled(false):

06-30 16:20:45.414: D/STS_SessionDetails(15876): processSessionCompleted 06-30 16:20:45.414: D/AndroidRuntime(15876): 关闭 VM 06-30 16:20:45.414: W/dalvikvm(15876): threadid=1: 线程以未捕获的异常退出 (group=0x41b62d88) 06-30 16:20:45.414: E/AndroidRuntime(15876): 异常 06-30 16:20:45.414:E/AndroidRuntime(15876):致命异常:主要 06-30 16:20:45.414: E/AndroidRuntime(15876): 进程: com.vvv.vvvvvvvvvvvvv, PID: 15876 06-30 16:20:45.414: E/AndroidRuntime(15876): java.lang.NullPointerException 06-30 16:20:45.414: E/AndroidRuntime(15876): 在 com.vvv.vvvvvvvvvvvvv.SessionDetails.processSessionCompleted(SessionDetails.java:237) 06-30 16:20:45.414: E/AndroidRuntime(15876): at com.vvv.vvvvvvvvvvvvv.Session.setSessionCompleted(Session.java:151)

看起来我失去了一些东西,但不知道是什么。 请帮忙。

【问题讨论】:

  • 尝试使用 FragmentStateAdapter 而不是 FragmentPagerAdapter

标签: android android-fragments fragmentpageradapter


【解决方案1】:

线

fragSessionDetails = (SessionDetails) mSectionsPagerAdapter.getItem(0);

是非常糟糕的方法。更好的方法是通过更改方法在运行时访问 Fragment:

public void setSessionCompleted(){
    ((SessionDetails) mSectionsPagerAdapter.getItem(0)).processSessionCompleted();
}

【讨论】:

  • 为什么不好?如果有可能使用片段的函数,最好创建一次。还是我不算数?
  • 首先它很糟糕,因为在某些情况下 FragmentAapter 可能会替换片段并且引用会出错。其次,您得到 null 可能是因为您在适配器实际膨胀 ViewPager 内的布局之前调用了 (SessionDetails) mSectionsPagerAdapter.getItem(0)。
  • 如果我的回答对您有帮助,如果您接受,我将不胜感激。
  • 如果是这种情况,我在日志中没有一行“D/STS_SessionDetails(15876): processSessionCompleted”。谢谢,我试过了,还是没解决问题。
【解决方案2】:

最后,我有一个解决方案。

public class SectionsPagerAdapter extends FragmentPagerAdapter {
static final int PAGE_COUNT = 2;
private SessionDetails fragSessionDetails;
private SessionScoreTable fragSessionScoreTable;

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {
    switch (index) {
    case 0:
        return new SessionDetails();
    case 1:
        return new SessionScoreTable();
    return null;
}

@Override
public int getCount() {
    return PAGE_COUNT;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
    // save the appropriate reference depending on position
    switch (position) {
        case 0:
            fragSessionDetails = (SessionDetails) createdFragment;
            break;
        case 1:
            fragSessionScoreTable = (SessionScoreTable) createdFragment;
            break;
    }
    return createdFragment;
}

public SessionDetails getFragSessionDetails(){
    return fragSessionDetails;
}

public SessionScoreTable getFragSessionScoreTable(){
    return fragSessionScoreTable;
}}

    public void setSessionCompleted(){
    SessionDetails fragSessionDetails = mSectionsPagerAdapter.getFragSessionDetails();
    if (fragSessionDetails != null) {
        Log.d(TAG, "fragSessionDetails");
        fragSessionDetails.processSessionCompleted();
    }
}

来自https://stackoverflow.com/a/29287415/2881525的想法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多