小编The*_*Vee的帖子

一劳永逸,如何在后台堆栈中正确保存Fragments的实例状态?

我在SO上发现了许多类似问题的实例,但遗憾的是没有答案符合我的要求.

我有纵向和横向的不同布局,我正在使用后台堆栈,这两个都阻止我setRetainState()使用配置更改例程使用和技巧.

我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中.仅使用活动编写我的应用程序时,以下工作正常:

TextView vstup;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.whatever);
    vstup = (TextView)findViewById(R.id.whatever);
    /* (...) */
}

@Override
public void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    state.putCharSequence(App.VSTUP, vstup.getText());
}

@Override
public void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    vstup.setText(state.getCharSequence(App.VSTUP));
}
Run Code Online (Sandbox Code Playgroud)

使用Fragments,这仅适用于非常特定的情况.具体来说,可怕的破坏是替换片段,将其放入后栈,然后在显示新片段时旋转屏幕.根据我的理解,旧片段onSaveInstanceState()在被替换时没有接收到调用但是以某种方式Activity与之相关联,并且此方法稍后在其View不再存在时调用,因此将我TextView的任何结果查找为a NullPointerException.

另外,我发现保留对我的引用对于s TextViews来说并不是一个好主意Fragment,即使它是正常Activity的.在这种情况下,onSaveInstanceState()实际上保存状态但是如果我在隐藏片段时旋转屏幕两次,则问题会重新出现,因为它onCreateView()不会在新实例中被调用.

我想把状态保存onDestroyView()到某个Bundle类型的类成员元素中(它实际上是更多的数据,而不仅仅是一个TextView)并保存,onSaveInstanceState()但还有其他缺点.首先,如果该片段当前显示,调用两个函数的顺序是相反的,所以我需要考虑两种不同的情况.必须有一个更清洁,更正确的解决方案!

android android-fragments

465
推荐指数
5
解决办法
27万
查看次数

glGenBuffers和glCreateBuffers的区别

鉴于我们使用OpenGL 4.5或支持GL_ARB_direct_state_access扩展,我们有新功能glCreateBuffers.

此函数具有相同的签名glGenBuffers,但指定:

返回n先前未使用的缓冲区名称buffers,每个缓冲区名称表示初始化的新缓冲区对象,就好像它已绑定到未指定的目标一样

glGenBuffers 有以下规格:

调用返回的缓冲区对象名称glGenBuffers不会被后续调用返回,除非它们首先被删除glDeleteBuffers.

因此,返回的任何缓冲区名称glCreateBuffers将永远不会再次使用,但可以使用glGenBuffers.

似乎glCreateBuffers总会创建新的缓冲区对象并返回它们的名称,并且glGenBuffers只有在之前没有删除过的缓冲区时才会创建新的缓冲区.

添加此功能有什么优势?

我什么时候应该glCreateBuffers用完glGenBuffers


PS
我认为这代表所有glCreate*添加的功能GL_ARB_direct_state_access

opengl opengl-4

18
推荐指数
3
解决办法
1万
查看次数

我可以按顺序链接异步任务(在前一个asynctask完成之后启动一个)

每次我执行一次操作httpRequest时,代码执行时屏幕似乎会被锁定几秒钟.因此,我曾经在一个单独的线程中AsyncTask做所有我的httpRequest东西,同时提出一个ProgressDialog用户知道正在发生的事情.

我最近遇到了以下情况:我的一个输入httpRequest取决于前一个httpRequest(+解析)操作的结果.我不能只是AsyncTask顺序地把两个s放在一起,因为Android将把它们放在两个线程中并启动第二个线程而不完成第一个线程.如果没有适当的输入(第一个结果httpRequest),我的第二个httpRequest将崩溃应用程序.

有没有办法我可以放入一个wait()强制第二个AsyncTask不要开始,直到第一个完成?

java android android-asynctask

16
推荐指数
2
解决办法
2万
查看次数

可以通过sdk实例化telephony.Phone对象吗?

我正在尝试获取一个电话对象,以便我可以在我的应用程序中呼叫和召开两个号码.

我试过使用静态PhoneFactory.makeDefaultPhones((Context)this)但没有运气.

String phoneFactoryName = "com.android.internal.telephony.PhoneFactory";
String phoneName = "com.android.internal.telephony.Phone";
Class phoneFactoryClass = Class.forName(phoneFactoryName);
Class phoneClass = Class.forName(phoneName);
Method getDefaultPhone = phoneFactoryClass.getMethod("getDefaultPhone");
Object phoneObject = getDefaultPhone.invoke(null);
Run Code Online (Sandbox Code Playgroud)

错误 - 由java.lang.RuntimeException引起:必须从Looper线程调用PhoneFactory.getDefaultPhone

android

15
推荐指数
2
解决办法
2万
查看次数

如何在屏幕底部显示选项菜单?

以下是我要实现的内容:当人们点击工具栏右上角的菜单时,屏幕底部会显示一个选项菜单.见下图:

在此输入图像描述

我不确定应该在底部调用该项目的方法.有人可以给我一些关于如何实现这一点的提示吗?

我使用下面的代码成功实现了右上方菜单栏中的图标.但我不知道如何在屏幕底部显示宽度match_parent和高度的选项wrap_content

点击右上角

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.edit_profile_image_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        switch (id) {
            case R.id.more:
                //How to show the 2 option in the bottom of screen here


                return true;
        }

        return super.onOptionsItemSelected(item);
    }
Run Code Online (Sandbox Code Playgroud)

更新

实现Nikesh的代码后,弹出窗口显示如下:

在此输入图像描述

java android android-layout android-xml android-menu

13
推荐指数
1
解决办法
4921
查看次数

在什么条件下生成纯虚方法存根?

我已经在很多地方(例如这里)读过有关人们在运行时遇到"纯虚方法调用"错误和程序崩溃的问题.这个答案说的是

大多数编译器将这样的vtable条目分配给存根,该存根在中止程序之前发出错误.

而且这个人甚至说Itanium ABI指定了那个存根.

问题是:编译器(GCC 6.4.1)在编译时将所有尝试看到这种行为的行为都视为未定义的引用.例如,当从抽象类的构造函数调用纯虚函数时,我收到警告

pure virtual ‘virtual int X::f()’ called from constructor

但同时根本没有生成任何代码,X::f()因此接下来是

undefined reference to 'X::f()'

从链接器和编译失败.这似乎是一种在运行时防止错误的非常简单的方法.在哪种情况下,我的编译器实际上需要生成上述存根?或者它是否足够聪明,足以及早发现所有可能的病理情况?

c++ gcc

13
推荐指数
1
解决办法
189
查看次数

C#中的C位字段

我需要将C结构转换为使用位字段的C#.

typedef struct foo  
{  
    unsigned int bar1 : 1;
    unsigned int bar2 : 2;
    unsigned int bar3 : 3;
    unsigned int bar4 : 4;
    unsigned int bar5 : 5;
    unsigned int bar6 : 6;
    unsigned int bar7 : 7;
    ...
    unsigned int bar32 : 32;
} foo;
Run Code Online (Sandbox Code Playgroud)

有人知道怎么做吗?

c c# bit-manipulation code-conversion

10
推荐指数
2
解决办法
6907
查看次数

继承第二级基类构造函数:silent error

我今天遇到了一个非常讨厌的错误,这是一个MWE:

#include <iostream>

class X {

public: 
  X() { std::cout << "Default" << std::endl; }
  X(int a) { std::cout << a << std::endl; }
};

class Y : public X { };

class Z : public Y {
  using X::X;
};

int main() {
  Z instance{3};
}
Run Code Online (Sandbox Code Playgroud)

与我的期望相反," Default"被打印出来.不可否认,代码是错误的,因为继承的构造函数Z尝试初始化X而不指定如何构造Y(*).但是,编译器不应该抱怨吗?默认构造函数Y(以及随后X)调用后的基本原理是什么,完全默默地忽略我的参数3?这是在标准的某处记录的吗?或者它是我编译器中的错误?

我的环境是gcc version 6.2.1 20160916 (Red Hat 6.2.1-2).即使使用,也不会生成编译器警告-Weffc++ -Wall -Wextra -pedantic.

c++ inheritance gcc constructor

8
推荐指数
1
解决办法
75
查看次数

为什么std :: atomic中的所有成员函数都带有volatile和不带volatile?

我注意到std::atomic<T>类型的大多数成员函数被声明两次,一次使用volatile修饰符,一次没有(示例)).我检查了G ++标准库实现的源代码,我发现所有这些都是完全重复的,例如,

bool
load(memory_order __m = memory_order_seq_cst) const noexcept
{ return _M_base.load(__m); }

bool
load(memory_order __m = memory_order_seq_cst) const volatile noexcept
{ return _M_base.load(__m); }
Run Code Online (Sandbox Code Playgroud)

我找不到任何示例,其中volatile变体的行为与非行为不同volatile,返回类型或该类型的任何内容都不同.

这是为什么?我认为volatile也可以在不是的对象中调用成员函数volatile.所以声明和定义std::atomic::load(...) const volatile noexcept等应该足够了.

更新:

根据评论我的问题基本归结为:你能提供一个例子,其中一些使用volatile实例(不一定是std::atomic)的调用会在以下两种情况下生成不同的程序集,

  1. 每个成员函数在有和没有相同的主体时出现volatile,

  2. 只有volatile变体存在?

这,假设编译器可以执行标准允许的任何优化(或者只是最高优化级别).

c++ volatile c++11

8
推荐指数
1
解决办法
231
查看次数

char_traits&lt;char&gt;::eof() 在 sizeof(int) == 1 的平台中如何编码?

我在 C++ 标准中找到了这些摘录(引自 N4687,但它可能永远存在):

\n\n

[字符.特征.typedefs]

\n\n
\n

对于某个字符容器类型char_type,相关的容器类型INT_T应该是能够表示相应char_type值转换的所有有效字符的类型或类,以及文件结束值eof()

\n
\n\n

[人物特征要求]

\n\n
\n

表达:X::eof()

\n\n

类型:X::int_type

\n\n

返回: 一个e适用X::eq_int_type(e,X::to_int_type(c))false所有 value 的值c

\n
\n\n

\n\n
\n

表达:X::eq_int_type(e,f)

\n\n

类型:bool

\n\n

返回:对于所有cdX::eq(c,d)等于X::eq_int_type(X::to_int_type(c), X::to_int_type(d))(...)

\n
\n\n

\n\n
\n

cd表示类型 的值CharT;(...); ef表示类型的值X::int_type

\n
\n\n

[char.traits.specializations.char]

\n\n …

c++ language-lawyer

7
推荐指数
1
解决办法
162
查看次数