小编Edm*_*Tam的帖子

Android Studio:改变targetSdkVersion的正确方法是什么?

我想在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?

android android-studio

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

方向更改后每次重新创建片段,无法恢复状态

更新:事实证明问题来自其他地方.感谢@Luksprog指出我忽略了什么.

  1. 该项目是使用Android Studio的导航抽屉图案创建的.抽屉在NavigationDrawerFragment课堂上实施.
  2. 当选择抽屉中的特定项目时,添加包含视图寻呼机的片段.代码实现了我的家庭活动.
  3. 当屏幕旋转时,调用onCreate()方法NavigationDrawerFragment,保留最后选择的项目.
  4. 这里出了什么问题 - 在娱乐时,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)

android android-configchanges android-fragments

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

Dart build_runner 只能扫描/读/写web/目录下的文件吗?

我正在开发一个 Flutter 应用程序,并且想编写一个构建脚本来将某种原始文件(CSV 格式)转换为格式化的 JSON 文件以作为 Flutter 资产包含在内。

通过使用像json_serializablejaguar_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)

dart flutter

5
推荐指数
1
解决办法
1213
查看次数

为什么 Flutter GlobalKey 的 currentState 从其他文件访问时为 NULL

这是我的代码:

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)

state key dart flutter

4
推荐指数
1
解决办法
8107
查看次数