我在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()但还有其他缺点.首先,如果该片段是当前显示,调用两个函数的顺序是相反的,所以我需要考虑两种不同的情况.必须有一个更清洁,更正确的解决方案!
鉴于我们使用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
每次我执行一次操作httpRequest时,代码执行时屏幕似乎会被锁定几秒钟.因此,我曾经在一个单独的线程中AsyncTask做所有我的httpRequest东西,同时提出一个ProgressDialog用户知道正在发生的事情.
我最近遇到了以下情况:我的一个输入httpRequest取决于前一个httpRequest(+解析)操作的结果.我不能只是AsyncTask顺序地把两个s放在一起,因为Android将把它们放在两个线程中并启动第二个线程而不完成第一个线程.如果没有适当的输入(第一个结果httpRequest),我的第二个httpRequest将崩溃应用程序.
有没有办法我可以放入一个wait()强制第二个AsyncTask不要开始,直到第一个完成?
我正在尝试获取一个电话对象,以便我可以在我的应用程序中呼叫和召开两个号码.
我试过使用静态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
以下是我要实现的内容:当人们点击工具栏右上角的菜单时,屏幕底部会显示一个选项菜单.见下图:
我不确定应该在底部调用该项目的方法.有人可以给我一些关于如何实现这一点的提示吗?
我使用下面的代码成功实现了右上方菜单栏中的图标.但我不知道如何在屏幕底部显示宽度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的代码后,弹出窗口显示如下:
我已经在很多地方(例如这里)读过有关人们在运行时遇到"纯虚方法调用"错误和程序崩溃的问题.这个答案说的是
大多数编译器将这样的vtable条目分配给存根,该存根在中止程序之前发出错误.
而且这个人甚至说Itanium ABI指定了那个存根.
问题是:编译器(GCC 6.4.1)在编译时将所有尝试看到这种行为的行为都视为未定义的引用.例如,当从抽象类的构造函数调用纯虚函数时,我收到警告
pure virtual ‘virtual int X::f()’ called from constructor
但同时根本没有生成任何代码,X::f()因此接下来是
undefined reference to 'X::f()'
从链接器和编译失败.这似乎是一种在运行时防止错误的非常简单的方法.在哪种情况下,我的编译器实际上需要生成上述存根?或者它是否足够聪明,足以及早发现所有可能的病理情况?
我需要将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)
有人知道怎么做吗?
我今天遇到了一个非常讨厌的错误,这是一个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.
我注意到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)的调用会在以下两种情况下生成不同的程序集,
每个成员函数在有和没有相同的主体时出现volatile,
只有volatile变体存在?
这,假设编译器可以执行标准允许的任何优化(或者只是最高优化级别).
我在 C++ 标准中找到了这些摘录(引自 N4687,但它可能永远存在):
\n\n[字符.特征.typedefs]
\n\n\n\n\n对于某个字符容器类型
\nchar_type,相关的容器类型INT_T应该是能够表示相应char_type值转换的所有有效字符的类型或类,以及文件结束值eof()。
[人物特征要求]
\n\n\n\n\n表达:
\n\nX::eof()类型:
\n\nX::int_type返回: 一个
\ne适用X::eq_int_type(e,X::to_int_type(c))于false所有 value 的值c。
\n\n\n表达:
\n\nX::eq_int_type(e,f)类型:
\n\nbool返回:对于所有
\nc和d,X::eq(c,d)等于X::eq_int_type(X::to_int_type(c), X::to_int_type(d))(...)
\n\n\n\n
c并d表示类型 的值CharT;(...);e并f表示类型的值X::int_type
[char.traits.specializations.char]
\n\n …android ×4
c++ ×4
gcc ×2
java ×2
android-menu ×1
android-xml ×1
c ×1
c# ×1
c++11 ×1
constructor ×1
inheritance ×1
opengl ×1
opengl-4 ×1
volatile ×1