小编Fra*_*per的帖子

InflateException:无法解析onClick处理程序的菜单项

我在6年前问过这个问题.与此同时,Android开发最佳实践已发生变化,我已成为更好的开发人员.

从那以后,我意识到使用onClickXML属性是一种不好的做法,并将其从我工作的任何代码库中删除.

我的所有点击处理程序现在都在应用程序的代码中定义,而不是XML布局!

我从不使用的理由onClick

  1. 很容易在onClickXML属性的值中出错,这将导致运行时错误
  2. 开发人员可能会重构单击处理程序方法的名称,而不会意识到它是从布局中调用的(请参阅原因1)
  3. 找出实际被调用的方法并不总是显而易见的.特别是如果片段正在使用布局
  4. 将布局与行为的关注分开是好的.使用onClick它们混合起来,这很糟糕!

我希望我已经说服你永远不要onClick在布局中使用:)!

下面是我原来的问题,这是一个很好的说明为什么使用onClick是一个坏主意.

===

我在XML中定义菜单项,并尝试使用API​​ 11中添加的onClick属性.当在运行4.0.3的模拟器中启动Activity时,会发生以下异常:

FATAL EXCEPTION: main
android.view.InflateException: Couldn't resolve menu item onClick handler 
    onFeedbackMenu in class android.view.ContextThemeWrapper

...
Caused by: java.lang.NoSuchMethodException: onFeedbackMenu 
    [interface com.actionbarsherlock.view.MenuItem]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
Run Code Online (Sandbox Code Playgroud)

我不明白导致异常的原因,因为我的Activity中定义了以下方法

import com.actionbarsherlock.view.MenuItem;
...
public void onFeedbackMenu( MenuItem menuItem ) { 
    Toast.makeText( this, "onFeedBack", Toast.LENGTH_LONG ).show();
}
Run Code Online (Sandbox Code Playgroud)

我的XML菜单定义文件包含:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
...
    <item
        android:id="@+id/menu_feedback"
        android:icon="@drawable/ic_action_share"
        android:showAsAction="ifRoom"
        android:title="@string/menu_feedback"
        android:onClick="onFeedbackMenu" />
</menu>
Run Code Online (Sandbox Code Playgroud)

为了向后兼容,我使用的是ActionBarSherlock,当我在2.3.x上运行App时,它也会得到一个非常类似的Exception.

这是堆栈跟踪的更完整版本 …

android actionbarsherlock android-actionbar

35
推荐指数
3
解决办法
2万
查看次数

不能使用@string表示法在AndroidManifest.xml中定义<intent-filter>

当我使用"@ string/action_name"来定义intent filter操作时,我的BroadcastReceiver永远不会被调用.如果我将来自strings.xml的相应字符串复制/粘贴到AndroidManifest.xml中,那么它可以完美运行!

AndroidManifest.xml中的工作示例:

<receiver
    android:name=".ServerUpdateReceiver" >
    <intent-filter>
        <action android:name="@string/ACTION_INFORM_USER_SERVER_UPDATE" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml的工作示例:

    <receiver
        android:name=".ServerUpdateReceiver" >
        <intent-filter>
            <action android:name="com.franklinharper.intent.action.ACTION_INFORM_USER_SERVER_UPDATE" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

为了完整起见,strings.xml包含以下行:

<string name="ACTION_INFORM_USER_SERVER_UPDATE">com.franklinharper.intent.action.ACTION_INFORM_USER_SERVER_UPDATE</string>
Run Code Online (Sandbox Code Playgroud)

android android-manifest

19
推荐指数
1
解决办法
2717
查看次数

保存和加载FlannBasedMatcher

如果训练图像集很大,训练OpenCV DescriptorMatcher可能是一项耗时的操作.因此,似乎将训练好的DescriptorMatcher数据保存到磁盘以便以后重新加载将是一件非常明显的事情.

不幸的是,似乎没有任何明显的解决方案来满足这种需求.

我最接近找到答案的是OpenCV讨论组中的这个主题.该线程始于2009年,人们仍在寻找2011年的答案!

从该线程获取的代码片段看起来应该从文件重新加载索引:

FileStorage fs("data.xml",FileStorage::READ);
Mat data;
fs["mtx"] >> data;
flann::Index idx(data,"index.bin");
Run Code Online (Sandbox Code Playgroud)

但我无法从中找出如何实现完整的保存/加载功能.

万一它是相关的,我正在使用OpenCV 2.3.1.

c++ opencv

7
推荐指数
1
解决办法
2235
查看次数

在Flutter app中立即显示应用主题

鉴于Flutter shared_prefs插件的异步特性,如何确保在启动应用程序时立即显示正确的主题设置?也就是说,一旦shared_prefs加载完成后,没有默认主题的闪存,然后应用正确的主题.

flutter

7
推荐指数
2
解决办法
1161
查看次数

具有动画提示/标签的TextField

我想实现一个包含TextFields的表单。每个字段都有一个标签/提示。我希望提示动画并在用户开始键入时成为标签。这是标准的Material设计模式,因此我希望它可以由标准的Widgets实现。

像这样: 在此处输入图片说明

flutter flutter-layout flutter-animation

7
推荐指数
3
解决办法
3002
查看次数

直接在Eclipse中启动Android Activity

在开发过程中,我想为我的应用程序中的几个活动创建运行配置,以便我可以直接转到我想要测试的活动.

但是当我创建一个新的Run配置时,对应于"Launch Action"的列表只包含MAIN Activity而不包含其他.

在@sparkymats建议之后,我尝试将IntentFilter添加到AndroidManifest.xml(空或带有android.intent.category.LAUNCHER类别),但活动列表仍然只包含MAIN活动.

我怎样才能直接开展其他活动?

eclipse android adt

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

Flutter:定义自定义TextStyles以在整个应用程序中使用

如何定义一小组自定义TextStyles,然后可以在我的应用程序中重复使用.自定义TextStyles应基于主题中定义的TextStyles.

我知道如何创建单独的TextStyles(例如)

Theme.of(context).textTheme.title.copyWith(fontWeight: FontWeight.bold,)
Run Code Online (Sandbox Code Playgroud)

flutter

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

CupertinoPageScaffold的儿童小部件是CupertinoNavigationBar的幕后推手

我正在尝试将内容放在CupertinoNavigationBar下面.

但是CupertinoNavigationBar部分涵盖了内容小部件.

我不明白为什么子列没有垂直偏移,因此CupertinoNavigationBar不覆盖顶部.

下面是截图和我的代码

iOS模拟器截图

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class PersonalInfoEditor extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: buildNavigationBar(context),
      child: Column(
        children: <Widget>[
          Text('Personal Info'),
          Text('t1'),
        ],
      ),
    );
  }

  CupertinoNavigationBar buildNavigationBar(BuildContext context) {
    return CupertinoNavigationBar(        
        trailing: CupertinoButton(
          child: Text('Save', style: TextStyle(color: CupertinoColors.activeBlue)),
          onPressed: () => Navigator.pop(context),
        ));
  }
}
Run Code Online (Sandbox Code Playgroud)

flutter

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

Android Time.format("%a")给出错误的星期几

我正在尝试检索给定时间戳的本地化日期.我的代码是这样的

String timestamp = "2011-08-01T15:55:03.000+02:00";
Time time = new Time();
time.parse3339(timestamp);
// In strftime format "%a" should be the abbreviated weekday name
// according to the current locale.
String result = time.format("%a")
Run Code Online (Sandbox Code Playgroud)

由于2011年8月1日是星期一,结果字符串应该是"星期一"(假设是英语语言环境),而是"Sun"!

android strftime

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