我有一个带标签的活动。为了创建选项卡,我使用了片段并使用以下适配器类:
class ViewPagerAdapter extends FragmentPagerAdapter
{
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
以下是我在活动中所做的。(剥离下来,为了清晰起见,去掉了无关的碎片)。
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
SummaryTabFragment frag1 = new SummaryTabFragment();
frag1.setUser(user);
adapter.addFragment(frag1, "Summary");
viewPager.setAdapter(adapter);
}
一切都很好,除了屏幕旋转的时候。应用程序在onCreateView中有对象变量的片段中崩溃,结果发现该片段的每个成员都是null,所以我收到一个NullPointerException。这很奇怪,因为当屏幕旋转,从而重新创建活动时,我会再次创建新的片段,设置成员变量,将它们添加到适配器中,并像以前一样设置viewPager。
我读过关于片段生命周期的文章,但不明白为什么这不起作用,因为我只是在重新创建一切。
我认为问题出在Fragment中,它有一些成员变量(字符串等)。当您旋转时,框架将调用默认构造函数(没有参数),因此您将松散输入数据。
要保留它,您应该尝试实现onSaveInstanceState(这里是示例)
Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key", value);
}
然后像这样保留
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(savedInstanceState!=null){
int id =savedInstanceState.getInt("key"); // get the value agains
}
...
}
注意:我建议您不要使用带有一些参数的片段构造函数。您应该使用Frament的默认构造函数,然后将额外数据按Bundle进行分段
Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);
然后在片段中检索数据(例如在onCreate()中),使用:
Bundle bundle = this.getArguments();
int myInt = bundle.getInt(key, defaultValue);
希望这能帮上忙
旋转变换rotate() 同画圆弧一样,这里的rotate(deg)传入的参数是弧度,不是角度。同时需要注意的是,这个的旋转是以坐标系的原点(0,0)为圆心进行的顺时针旋转。所以,在使用rotate()之前,通常需要配合使用translate()平移坐标系,确定旋转的圆心。即,旋转变换通常搭配平移变换使用的。 最后一点需要注意的是,Canvas是基于状态的绘制,所以每次旋转都是接着上次旋转的基础上
在屏幕旋转后,虽然我在super.onCreate(null);,中传递null,但我得到了object返回的nullPointerException异常。我知道在传递savedInstanceState=null的同时必须销毁并重新创建活动,这意味着活动应该在旋转后开始,因为它是第一次开始,为什么在旋转后会出现此异常? onCreate()代码段,其中名为historyText的对象 Logca
旋转设备后,我们在Backback或fragmentSupportManager中的任何片段都会激活onSaveInstanceState。 但是,在第一次旋转之后,内部的所有内容都为null(所有变量),应用程序会因null指针异常而崩溃。 我想知道为什么如果片段实际上被销毁为零(所有值都为null),为什么片段仍然存在,并且调用onSaveInstanceState? 我的代码很深,有多个基类
我试图在C类中实现一个返回模板参数的constexpr成员函数。代码应该是c 11兼容的。然而,当模板化的类还包含STL容器作为数据成员时,比如STD::vector(const expr成员函数不涉及它),我会遇到编译问题。 以下代码给出了一个最小的示例: 代码使用命令正确编译 g -std=c 14 -O3 快速测试.cpp -o 测试 -Wall clang-STD = c 11-O3 qu
我有一个片段,在这里我调用自定义视图类(Dragger) 并且我有另一个片段与和适配器,在其中我调用方法通过主机的活动的。 我发现在中旋转后会获得新的引用,但当我从适配器调用时-为空。 我真的不明白为什么字段得到引用,然后又丢失了它) 有人知道这有什么不对吗? 提前谢谢! P. S.:主机活动
这里列出了所有文档化的结构体和联合体的成员变量,并附带结构或联合所属的文件: - a - addr : rt_i2c_bus_device , rt_i2c_msg ai_addr : addrinfo ai_addrlen : addrinfo ai_canonname : addrinfo ai_family : addrinfo ai_flags : addrinfo ai_next : a