通过在Swift 3.0中删除传统的C风格for循环,我该如何做到以下几点?
for (i = 1; i < max; i+=2) {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
在Python中,for-in控制流语句具有可选的步骤值:
for i in range(1, max, 2):
# Do something
Run Code Online (Sandbox Code Playgroud)
但Swift范围运营商似乎没有相应的:
for i in 1..<max {
// Do something
}
Run Code Online (Sandbox Code Playgroud) 我有一个带有gridlayout的recyclerview.我想要的是当用户滚动到列表的末尾时(请参阅我的坏模型),应该有一个高度为50dp的空白空间,这与我的网格尺寸不同.
请注意,此空间仅在最末端可见,因为我不想更改布局.我可以这样做,以便recycerview的边距为50dp,但我不想这样做.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:scrollbars="vertical"
/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud) android android-layout android-gridlayout android-recyclerview
假设我有一个Earthquake有字段的类public final double magnitude;,我的布局类似于这个:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="earthquake" type="com.example.Earthquake"/>
</data>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="48dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@{String.format(earthquake.magnitude)}" />
...
</LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
注意我必须"@{String.format(earthquake.magnitude)}"使用此字段,否则我收到此错误:
在android.widget.TextView上找不到属性'android:text'的setter,参数类型为double.
不幸的是,这导致双重打印完全准确.如何格式化显示的double值?
假设我有一些Swift类,其中包含我想要暴露给Objective-C的方法:
@objc(Worker) class Worker : NSObject {
func performWork(label: String = "Regular Work") {
// Perform work
}
}
Run Code Online (Sandbox Code Playgroud)
我可以用两种方式来称呼它:
Worker().performWork()
Worker().performWork("Swift Development")
Run Code Online (Sandbox Code Playgroud)
但是,当从Objective-C调用时,我没有得到此方法的"默认"版本 - 我必须提供一个标签:
[[[Worker alloc] init] performWork:@"Obj-C Development"];
Run Code Online (Sandbox Code Playgroud)
请参阅AppName-Swift.h下面的标题中的定义:
SWIFT_CLASS_NAMED("Worker")
@interface Worker : NSObject
- (void)performWork:(NSString * __nonnull)label;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
Run Code Online (Sandbox Code Playgroud)
我希望看到一个带有此签名的方法:
- (void)performWork;
Run Code Online (Sandbox Code Playgroud)
我意识到ObjC不支持默认参数值,但我的假设是Swift默认值只是生成额外的Swift函数,而简单的实现调用"真实"函数(即它们是语法糖,隐藏了我们用于的典型实现) OBJ-C).
有没有办法将此默认值公开给Objective-C?如果没有,任何人都可以向我指出任何文件,说明为什么这不可用?
我想使用appendFormat将字符串附加到NSMutableString,插入空格以获得字符串的最小长度.
在objective-c中,我刚刚使用过
[text.mutableString appendFormat:@"%-12s", "MyString"];
Run Code Online (Sandbox Code Playgroud)
我会的
"MyString "
Run Code Online (Sandbox Code Playgroud)
但在斯威夫特,我试过了
text.mutableString.appendFormat("%-12s", "MyString")
Run Code Online (Sandbox Code Playgroud)
我得到了一切,但不是"MyString".它似乎是一些随机字符,我不知道它来自哪里.
有没有人知道为什么会这样,我该怎么办?
感谢你们!
我可以选择以下任一方式检查我的应用是否具有给定的权限.
哪一个更受欢迎?
ContextCompat(来自support-compatlib):
ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
Run Code Online (Sandbox Code Playgroud)
或者PermissionChecker(来自support-core-utilslib):
PermissionChecker.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
Run Code Online (Sandbox Code Playgroud)
请注意(截至25.3.1)-core-utils取决于-compat:
| | +--- com.android.support:support-core-utils:25.3.1
| | | +--- com.android.support:support-annotations:25.3.1
| | | \--- com.android.support:support-compat:25.3.1 (*)
在使用模拟器时,我注意到在尝试查看YouTube视频时,浏览器会出现错误消息,说明无法加载页面vnd.youtube:ngc978y6rCU?some=parameters.我没有Android设备,但我可以假设启动VIEW设置数据URI 的意图vnd.youtube:VIDEO_ID将启动默认的YouTube应用程序并观看该视频.
现在,我的应用程序必须能够显示YouTube视频.现在我有一个定制的YouTube活动就是这样,但我想:
VIEW用vnd.youtube:VIDEO_IDUri 启动一个意图,或Intent 可用并使用它,或者,如果它不可用,使用我的自定义活动.这是一个好主意吗?这有用吗(正如我说我没有Android设备,我只是从朋友那里借一个来测试我的最终应用程序)?我该走哪条路?
我有一个Android Daydream,使用Twitter4j的流媒体实现显示一连串的推文.这适用于Android 4.2和4.3.但是在4.4上,我无法快速关闭流(in onDreamingStopped).
我得到这个堆栈跟踪,但NetworkOnMainThreadException不是问题.
连接重用问题似乎与此问题有关.这个OkHttp变更集(在这里合并到Android中)改变了close行为方式ChunkedInputStream.如果还有更多数据需要读取,它现在会尝试丢弃流,而不是简单地将自己标记为"已关闭"然后断开套接字,以便能够快速重用套接字.如果它无法丢弃流,则会像以前一样断开套接字.
我现在得到a的原因NetworkOnMainThreadException是因为(从堆栈跟踪中看到)丢弃流现在尝试从流中读取.这很容易解决 - 我只是AsyncTask在关闭我的白日梦时放弃它并忘掉它.
问题是在超时集内没有丢弃流.查看HttpTransport#discardStream最新版本源的方法,它指定套接字上的100ms超时(原始提交指定30ms),然后尝试从stream(Util.skipAll)读取以清空缓冲区.但是我看到BufferedInputStream.read()呼叫周围有多秒钟的延迟.这种延迟的长度似乎有所不同.
这不是一个大问题 - 因为我现在必须从UI线程关闭此流,我不会导致onDreamingStopped调用需要很长时间才能返回(这导致白日梦停留在屏幕上很长时间按下/回家后的时间 - 我最初的错误报告导致我跟随这个兔子洞.但是,它确实会在关闭之后将此连接暂停一段时间.
我已经测试了使用两个不同活动级别的Twitter帐户关闭流所需的时间.第一个在我试图关闭流时没有看到任何活动,我一直看到通话大约需要30秒.第二个帐户有更多的活动,关闭流的时间在这个上更加多变 - 从1.5到30秒不等.当一条新的推文进入时,它会立即关闭(一个新的块被写入流中).
为什么我在关闭KitKat的流时遇到这种延迟?为什么它不尊重正在设置的100ms超时?
这类似于Android KitKat HttpURLConnection断开AsyncTask - 虽然这可能是FixedLengthInputStream在引擎盖下使用,但同样的更改已应用于close该类的方法.
我有各种各样的文件,我不想通过新的 Marshmallow Autobackup 功能进行备份- 一个领域数据库,一个我用来存储“最近看到”信息的共享首选项文件,日志文件等。
而不是使用<exclude ... />对于这些,我更愿意简单地备份的唯一文件我做的关心-用户设置,存储在默认的共享偏好。文档表明使用 an<include ... />将自动排除未明确包含的每个文件。
默认共享首选项文件使用什么路径?
<full-backup-content>
<include domain="sharedpref" path="?"/>
</full-backup-content>
Run Code Online (Sandbox Code Playgroud) 我正在使用XMPP(smack)创建消息传递应用程序,每当收到新消息时我都会发送通知.问题是,如果我收到来自两个不同用户的消息,我只能看到最后一个通知.我该怎么改变它?这是我的代码.
Intent thisIntent = new Intent(mApplicationContext, ChatActivity.class);
thisIntent.putExtra("EXTRA_CONTACT_JID",contactJid);
PendingIntent contentIntent = PendingIntent.getActivity(mApplicationContext, 0, thisIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder b = new NotificationCompat.Builder(mApplicationContext);
b.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.fab_bg_mini)
.setTicker("Hearty365")
.setContentTitle("New message")
.setContentText(" You received a new message from " + contactJid)
.setContentIntent(contentIntent)
.setContentInfo("Info");
if(!ChatActivity.active){
b.setDefaults(Notification.DEFAULT_LIGHTS| Notification.DEFAULT_SOUND);
}
NotificationManager notificationManager = (NotificationManager) mApplicationContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, b.build());
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我放了一个额外的contactJid,这对我来说非常重要.我需要设置它,如果用户点击一个通知,其contactJid将是这个,如果另一个,它的contactJid将是另一个.
根据标题.我单击我的按钮,可以在调用线路上的断点处进入调试器openPicker.PickSingleFileAsync()- 但此调用永远不会返回.我可以选择一个文件,然后单击"打开",但我从未回到我的方法中来实际对该文件执行某些操作.这一切都在一个新的Windows Metro"空白应用程序"中,只有一个按钮和一个图像.
private void Button_Click_1(object sender, RoutedEventArgs e)
{
OpenFile().Wait();
}
private async Task OpenFile()
{
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
// can break on following line
var file = await openPicker.PickSingleFileAsync();
// this line is never reached
if (file != null)
{
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这是根据MSDN上的示例代码.当我使用PickMultipleFilesAsync时,我得到相同的结果.
我错过了一些明显的东西吗
错误信息:
android.database.sqlite.SQLiteException: near "transaction": syntax error (code 1): , while compiling: **create table transaction ( _id integer primary key autoincrement, amount real, type varchar(20), date integer)
Run Code Online (Sandbox Code Playgroud)
我的应用程序存储由自动生成的ID,花费的金额,付款类型和日期组成的货币交易.我的应用程序编译正常,但是当我尝试运行数据库是sqlite数据库的活动时,应用程序崩溃了上面的消息.至于我意识到我的SQL语句是有效的,任何人都可以提供任何可能是原因的洞察力吗?
Java代码:
db.execSQL("create table transaction (" +
" _id integer primary key autoincrement, amount real, type varchar(20), date integer)");
Run Code Online (Sandbox Code Playgroud)
谢谢