首页 > 解决方案 > 从主要活动访问方法和内容的片段(一切都为空)

问题描述

尝试在类扩展片段中实现更改图像。MainActivity使用FragmentPagerAdapter应用程序单击菜单中的按钮后总是崩溃。

起初,我从片段中得到一个空错误,然后用从主活动按钮单击getActivity()发送替换这些错误。ImageView它帮助了一会儿,然后我不得不从中移动 int 数组声明,onCreateView()否则它又是空的,但我不得不面对的最后一个坏男孩是super(context).

根据谷歌的说法,由于创建活动而发生的事情随之而来onCreateView()getActivity()上下文和公共变量是无法访问的。如何更换它?我应该在哪里放置一些特殊的行来从片段中获取上下文并访问其中的所有内容?

这是我的代码

//from main activity click
private void loadImage() {
    ImageView v = findViewById(R.id.view_core);
    FragmentHistogram frag = new FragmentHistogram();
    getFragmentManager().executePendingTransactions(); //that str also did not help
    frag.reseter(v);
}

//tried that in fragment but that did not help
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof Activity){
        a=(Activity) context;
    }
}

===更新===

// in MainActivity
TabAdapter adapter;
Fragment fr;
@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_tabs);

    ViewPager viewPager = findViewById(R.id.view_pager);
    TabLayout tabLayout = findViewById(R.id.tabs);

    adapter = new TabAdapter(this, getSupportFragmentManager()); //FragmentPagerAdapter 
    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager);
    fr = adapter.getItem(1); 
} 

 // modified on click also in MainActivity
   private void loadImage() {
    ((FragmentHistogram) fr).reseter(v); //FragmentHistogram fragment class with reseter() method
} 

但这也不起作用,上下文再次为空。在onCreate我已经将上下文传递thisadapter因此上下文已经不为空时,然后我从它的位置定义确切的片段并通过转换获取方法。但是,即使在这种情况下,我vreseter()无法找到该视图,因为它的活动尚未开始。

还有一件事我忘了提。我在片段类中有一个内部类,它需要上下文。也许这就是问题所在?

class lHistogram extends View {

    public lHistogram(Context context, Bitmap bi) {            
        super(context);
    }

===更新 2===

public class TabAdapter extends FragmentPagerAdapter {

final int PAGE_COUNT = 2;
private Context mContext;

public TabAdapter(Context context, FragmentManager fm) {
    super(fm);
    mContext = context;
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new FragmentCore();
        default:
            return new FragmentHistogram();
    }
...
}

我猜这个问题可能出在片段创建顺序上。我的意思是添加到onViewCreated日志行中,我发现无论我在其中设置的顺序Fragment getItem(int position)总是将上下文发送到FragmentCore,这意味着即使FragmentHistogram显示为第一页上下文仍然在第二个。什么控制上下文分配?

标签: javaandroidandroid-fragmentsandroid-activity

解决方案


解决方案,选择 1 或 2;两者都适用于我的情况:

  1. https://stackoverflow.com/a/51253168/8859693

添加到每个FragmentonCreate(),尝试调用方法setRetainInstance(true)

  1. https://stackoverflow.com/a/51271379/8859693

添加mcontext=getContext();类扩展FragmentPagerAdapter

public class TabAdapter extends FragmentPagerAdapter {

final int PAGE_COUNT = 2;
private Context mContext;

public TabAdapter(Context context, FragmentManager fm) {
    super(fm);
    mContext = context;
}

推荐阅读