我正在与Android糟糕的布局系统作斗争.我正试图让桌子填满屏幕(简单吧?)但是这太难了.
我让它以某种方式在XML中工作,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent">
<TableRow android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
<Button android:text="A" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1"/>
<Button android:text="B" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1"/>
</TableRow>
<TableRow android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
<Button android:text="C" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1"/>
<Button android:text="D" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1"/>
</TableRow>
Run Code Online (Sandbox Code Playgroud)
但是我不能让它在Java中工作.我已经尝试过一百万种LayoutParams组合,但没有任何效果.这是我最好的结果,它只填充屏幕的宽度,而不是高度:
table = new TableLayout(this);
// Java. You suck.
TableLayout.LayoutParams lp = new TableLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
table.setLayoutParams(lp); // This line has no effect! WHYYYY?!
table.setStretchAllColumns(true);
for (int r = 0; r < 2; ++r)
{
TableRow row = new TableRow(this);
for …Run Code Online (Sandbox Code Playgroud) 如果我在C++中有一个列表,我该如何将它暴露给QML(在Qt5/QtQuick 2中)?似乎QML只能理解 - QObject派生类,这是一个问题,因为QObjects不能放入QList或复制.我该怎么做呢:
struct Thing
{
int size;
QString name;
};
class ThingManager : public QObject
{
Q_OBJECT
// These macros support QtQuick, in case we one day want to use it to make a slick
// interface (when QML desktop components are released).
Q_PROPERTY(QList<Thing> things READ things NOTIFY thingssChanged)
public:
// ...
QList<Thing> things() const;
// ...
};
Run Code Online (Sandbox Code Playgroud)
所以我可以在QML中做这样的事情:?
var a = thingManager.things[0].name;
Run Code Online (Sandbox Code Playgroud) 为什么这不起作用?
#include <map>
#include <memory>
void deleter(int* i) {
delete i;
}
std::map<int, std::unique_ptr<int, decltype(&deleter)>> m;
void foo(int* i) {
m[0] = std::unique_ptr<int, decltype(&deleter)>(i, &deleter);
}
Run Code Online (Sandbox Code Playgroud)
看看难以理解的编译错误https://godbolt.org/z/Uhp9NO.
In file included from <source>:1:
In file included from /opt/compiler-explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../include/c++/8.2.0/map:61:
In file included from /opt/compiler-explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../include/c++/8.2.0/bits/stl_map.h:63:
/opt/compiler-explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../include/c++/8.2.0/tuple:1668:9: error: no matching constructor for initialization of 'std::unique_ptr<int, void (*)(int *)>'
second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
^
/opt/compiler-explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../include/c++/8.2.0/tuple:1655:9: note: in instantiation of function template specialization 'std::pair<const int, std::unique_ptr<int, void (*)(int *)> >::pair<int &&, 0>' requested here
: pair(__first, __second, …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现此处描述的行为,其中通知(或其他)在您的应用中启动"内部"活动,然后当用户按下它时进入我的"主页"活动.
Android文档说
对于"后退"按钮,您应该通过在任务的后台堆栈中插入应用程序最顶层屏幕的完整向上导航路径,使导航更具可预测性.这允许忘记他们如何进入您的应用程序的用户在退出之前导航到应用程序的最顶层屏幕.
有没有一个好方法来实际做到这一点?关于Stackoverflow的其他问题建议启动主要活动,意图告诉它开始内部活动,但这似乎是一个巨大的黑客,我有点怀疑谷歌会在Gmail中使用,我认为有一个不错的方法,给定他们在倡导这种行为.
那么有一种非黑客的方法吗?
出于某种原因,我的Android手机不会进入睡眠状态.我认为唤醒锁是保持清醒,但没有办法分辨哪些唤醒锁是活跃的.正在运行的服务没有列出任何可疑的东西,当然也没有什么不同.所以我的问题是:
当进程结束时,Android肯定会发布唤醒锁吗?有可能是一个应用程序写得不好而且在退出之前没有发布唤醒锁吗?
有没有办法看到活跃的唤醒锁?
这是dumpsys power显示:
$ dumpsys power
Power Manager State:
mIsPowered=true mPowerState=0 mScreenOffTime=226093 ms
mPartialCount=0
mWakeLockState=
mUserState=
mPowerState=
mLocks.gather=
mNextTimeout=91922738 now=92136117 -213s from now
mDimScreen=true mStayOnConditions=0
mScreenOffReason=3 mUserState=0
mBroadcastQueue={-1,-1,-1}
mBroadcastWhy={0,0,0}
mPokey=1 mPokeAwakeonSet=false
mKeyboardVisible=false mUserActivityAllowed=false
mKeylightDelay=6000 mDimDelay=47000 mScreenOffDelay=7000
mPreventScreenOn=false mScreenBrightnessOverride=-1 mButtonBrightnessOverride=-1
mScreenOffTimeoutSetting=60000 mMaximumScreenOffTimeout=2147483647
mLastScreenOnTime=0
mBroadcastWakeLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mStayOnWhilePluggedInScreenDimLock=UnsynchronizedWakeLock(mFlags=0x6 mCount=0 mHeld=false)
mStayOnWhilePluggedInPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mPreventScreenOnPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mProximityPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
mProximityWakeLockCount=0
mProximitySensorEnabled=false
mProximitySensorActive=false
mProximityPendingValue=-1
mLastProximityEventTime=0
mLightSensorEnabled=false
mLightSensorValue=-1.0 mLightSensorPendingValue=-1.0
mLightSensorScreenBrightness=35 mLightSensorButtonBrightness=255 mLightSensorKeyboardBrightness=0
mUseSoftwareAutoBrightness=true
mAutoBrightessEnabled=false
mScreenBrightness: animating=false targetValue=-1 curValue=0.0 delta=-1.3333334
mLocks.size=0: …Run Code Online (Sandbox Code Playgroud) Cppreference 有以下示例代码std::transform:
std::vector<std::size_t> ordinals;
std::transform(s.begin(), s.end(), std::back_inserter(ordinals),
[](unsigned char c) -> std::size_t { return c; });
Run Code Online (Sandbox Code Playgroud)
但它也说:
std::transform不保证unary_op或的有序应用binary_op。要将函数按顺序应用于序列或应用修改序列元素的函数,请使用std::for_each。
这大概是为了允许并行实现。但是,的第三个参数std::transform是 a LegacyOutputIterator,它具有以下后置条件++r:
在此操作之后
r不需要是可递增的,并且r不再需要可取消引用或可递增的先前值的任何副本。
所以在我看来,输出的分配必须按顺序进行。它们是否只是意味着应用程序unary_op可能会乱序,并存储到临时位置,但按顺序复制到输出?这听起来不像你想做的事情。
大多数 C++ 库还没有真正实现并行执行器,但微软已经实现了。我很确定这是相关的代码,我认为它调用这个populate()函数来将迭代器记录到输出的块中,这肯定不是一件有效的事情,因为 LegacyOutputIterator可以通过增加它的副本来失效。
我错过了什么?
这里发生了什么(游乐场)?
struct Number {
num: i32
}
impl Number {
fn set(&mut self, new_num: i32) {
self.num = new_num;
}
fn get(&self) -> i32 {
self.num
}
}
fn main() {
let mut n = Number{ num: 0 };
n.set(n.get() + 1);
}
Run Code Online (Sandbox Code Playgroud)
给出了这个错误:
error[E0502]: cannot borrow `n` as immutable because it is also borrowed as mutable
--> <anon>:17:11
|
17 | n.set(n.get() + 1);
| - ^ - mutable borrow ends here
| | |
| | …Run Code Online (Sandbox Code Playgroud) javascript之间的区别Array,Object并不是很大.实际上它似乎Array主要添加了length字段,因此您可以将Arrays和Objects用作数字数组:
var ar = new Array();
ar[0] = "foo";
ar["bar"] = "foo";
var ob = new Object();
ob[0] = "foo";
ob["bar"] = "foo";
assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true.
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,在流行的JavaScript引擎(V8,JavaScriptCore,SpiderMonkey等)中,这是如何处理的?显然,我们不希望我们的数组实际存储为具有键值的哈希映射!我们怎样才能合理地确定我们的数据是否存储为实际数组?
据我所知,引擎可以采取一些方法:
Array实现方式与Object- 使用字符串键的关联数组完全相同.Array是一个特殊情况,一个std::vector支持数字键的类似数组,以及一些密度启发式,以防止疯狂的内存使用ar[100000000] = 0;Array是相同的Object,并且所有对象都获得启发式,以查看使用数组是否更有意义.如果有一个合适的阵列类型(咳嗽 WebGL类型阵列咳嗽),这真的会更简单.
我正在尝试将库存ICS启动器变成一个独立的应用程序.我几乎就在那里 - 唯一不起作用的是搜索图标和将小部件放到屏幕上,这会导致崩溃.
崩溃是因为股票启动器appWidgetManager.bindAppWidgetId(appWidgetId, componentName);用来添加小部件,显然只有系统应用程序才有权这样做.
所以我的问题是,非系统应用程序添加小部件并获得与库存ICS启动器相同的UI体验的正确方法是什么?
android ×4
c++ ×3
rust ×2
android-4.0-ice-cream-sandwich ×1
arrays ×1
c++17 ×1
java ×1
javascript ×1
launcher ×1
layout ×1
module ×1
performance ×1
process ×1
public ×1
qlist ×1
qml ×1
qt5 ×1
qtquick2 ×1
rust-crates ×1
spidermonkey ×1
stl ×1
tablelayout ×1
unique-ptr ×1
v8 ×1
wakelock ×1
widget ×1
xml ×1