我想在Android Studio(而不是Eclipse)中将targetSdkVersion从19更改为18,但是失败了.
更改targetSdkVersion后,Android Studio会抱怨以下内容,并使用Gradle文件重新同步项目:
Execution failed for task ':(project name):processDebugManifest'.
> Manifest merging failed. See console for more info.
Run Code Online (Sandbox Code Playgroud)
从控制台我发现它是我使用旧的targetSdkVersion值添加到gradle依赖项的库.
[(Code Directory)\main\AndroidManifest.xml, (Code Directory)\build\exploded-bundles\(Library Directory).aar\AndroidManifest.xml:2] Main manifest has <uses-sdk android:targetSdkVersion='18'> but library uses targetSdkVersion='19'
Run Code Online (Sandbox Code Playgroud)
我了解到在Android Studio中,target.SdkVersion和minSdkVersion标志在build.gradle文件中定义.该项目是使用Android Studio的"新项目"向导创建的,我的代码的AndroidManifest.xml中没有标记.所以问题不应该是两个不同步的值.根据上面的消息,主清单中的targetSdkVersion值是我想要的.
所以问题应该在库的清单文件中.我打开库的AndroidManifest.xml文件,找到以下行:
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19"/>
Run Code Online (Sandbox Code Playgroud)
显然这是不正确的.问题是该文件不是手动修改.我尝试更改targetSdkVersion值,甚至尝试删除声明,但每次构建项目时它都会返回.
我试着打扫这个项目,但还是没有运气.
所以我的问题是:是否有一种"正确"的方式来改变我不知道的Android Studio中的targetSdkVersion?
更新:事实证明问题来自其他地方.感谢@Luksprog指出我忽略了什么.
NavigationDrawerFragment课堂上实施.onCreate()方法NavigationDrawerFragment,保留最后选择的项目.NavigationDrawerFragment会再次调用selectItem(),这会触发我的菜单项选择处理程序.这会导致Android恢复ListFragment.通过检查菜单选择处理程序代码中的活动菜单项可以防止这种情况.
我想保留最后一个查看页面索引,该索引ViewPager是由任何原因重新创建活动的时间,例如方向更改.
的ViewPager是在Fragment(命名ListFragment),其被附接到的活性.我正在使用compat库,因此片段是它的子类android.support.v4.app.Fragment.
我认为可以通过覆盖onSaveInstanceState()方法并添加适当的逻辑来完成onCreate(),如文档中所述:
要正确处理重新启动,您的活动必须通过正常的Activity生命周期恢复其先前的状态,在此生命周期中Android会在销毁活动之前调用onSaveInstanceState(),以便您可以保存有关应用程序状态的数据.然后,您可以在onCreate()或onRestoreInstanceState()期间恢复状态.
但是片段的情况似乎不同.当我从此导航ListFragment到另一个活动并按下"返回" 时,可以正确恢复页面索引.但是,当我旋转设备时,页面索引会丢失.
我添加了一些日志记录,看看有什么问题.从日志中我发现,虽然onSaveInstanceState() 的ListFragment(我称之为ListFragment A)正确调用,这个特殊的片段类不再在活动中.当方向改变并重新创建活动时,Android调用onSaveInstanceState()后跟onDetach()分离此片段.然后,Android会创建一个新实例ListFragment(我将其命名为ListFragment B)并将其附加到新的旋转活动中.此ListFragment B将空savedInstanceState传递给构造函数,因此最后一页索引(以及片段A的savedInstanceState中的任何配置)都将丢失.
实际上,ListFragment每次屏幕旋转时都会创建一个新实例,但似乎旧的实例不会被销毁.我在旋转设备时会看到如下所示的日志:
D/ListFragment? [1110257048] onSaveInstanceState() called, storing last page index 3
D/ListFragment? [1109835992] onSaveInstanceState() called, storing last page index 0
D/ListFragment? …Run Code Online (Sandbox Code Playgroud) 我正在开发一个 Flutter 应用程序,并且想编写一个构建脚本来将某种原始文件(CSV 格式)转换为格式化的 JSON 文件以作为 Flutter 资产包含在内。
通过使用像json_serializable和jaguar_serializer我了解的库build_runner,所以看起来我自己编写Builder并通过调用它build_runner是一种明智的方式。
由于有关编写我们自己的构建脚本的资源非常有限,我首先修改了此处找到的示例。但是我在尝试更改输入输出文件的路径时卡住了:当我运行时flutter pub pub run build_runner build,结果发现Dart只搜索[project_dir]/web目录中匹配的文件,并且只允许我将文件写入该web目录。所以这段代码
buildStep.writeAsString(new AssetId(buildStep.inputId.package, 'assets/resources/foo.json'), '[]');
Run Code Online (Sandbox Code Playgroud)
将产生以下异常:
UnexpectedOutputException: myapp|assets/resources/foo.json
Expected only: {myapp|web/.json}
[SEVERE] Failed after 24.4s
Run Code Online (Sandbox Code Playgroud)
json_serializable并且jaguar_serializer可以在任何地方自由生成代码这一事实似乎表明我的配置有问题。但是我web在我的代码和build.yaml文件中的任何地方都找不到这个东西,所以这真的很令人费解。
FWIW,这是我的builder.yaml文件的内容:
builders:
jsonBuilder:
import: "package:myapp/builder.dart"
builder_factories: ["jsonFileBuilder"]
build_extensions: {"source.csv": [".json"]}
build_to: source
auto_apply: root_package
Run Code Online (Sandbox Code Playgroud)
这是builder.dart文件
import 'dart:async';
import 'package:build/build.dart';
Builder jsonFileBuilder(BuilderOptions …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
import 'package:flutter/material.dart';
void main() {
runApp(new MyStatefulApp(key: App.appStateKey));
}
/// Part [A]. No difference when appStateKey is defined as variable.
class App {
static final GlobalKey<MyAppState> appStateKey = new GlobalKey<MyAppState>();
}
/// Part [B]
class MyStatefulApp extends StatefulWidget {
MyStatefulApp({Key key}) :super(key: key);
@override
MyAppState createState() => new MyAppState();
}
class MyAppState extends State<MyStatefulApp> {
int _counter = 0;
add() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "App",
theme: new ThemeData( …Run Code Online (Sandbox Code Playgroud)