我在视图中有几个小部件,每个小部件都需要自己的ActionMode.我看到当用户点击操作栏之外时,ActionMode不会自动解除.因此,用户很容易为一个控件启动ActionMode,然后点击(在我的情况下为longclick)另一个控件,并在第一个控件上堆叠第二个ActionBar.这会导致编程逻辑严重破坏.
我可以使用活动级别的成员变量跟踪当前的ActionMode,如果需要新的成员变量,则忽略当前的ActionMode.但是,这使得我的代码在阅读和维护时变得混乱.而且,当用户点击操作栏之外的任何内容时,我宁愿立即将其解雇.
有关处理此问题的好方法的任何建议吗?
在最近的Android Studio更新(目前我正在运行3.1.2)之后,logcat开始间歇性地丢弃时间戳和PID信息.
05-01 13:26:03.962 12909-12909/com.perinote.perinote D/Perinote: SG(BI) Intercept DOWN, state NONE
    SG(BI) long timer started 1525206363962, for 500, to 1525206364462
05-01 13:26:03.965 12909-12909/com.perinote.perinote D/Perinote: SG(BI) DOWN, state ONE
05-01 13:26:04.008 12909-12909/com.perinote.perinote D/Perinote: SG(PF) Intercept UP, state ONE
    SG(PF) long timer cancelled
05-01 13:26:04.010 12909-12909/com.perinote.perinote D/Perinote: SG(BI) UP, state ONE
    SG(BI) long timer cancelled
    SG(BI) double timer started
05-01 13:26:04.011 12909-12909/com.perinote.perinote D/Perinote: SG(BI) UP, ret true
05-01 13:26:04.310 12909-12909/com.perinote.perinote D/Perinote: SG(BI) double timer done
    SG(BI) SINGLE_TAP 578,82
    BI single tap
    BL …Run Code Online (Sandbox Code Playgroud) 新:我正在寻找的主要内容是修复错误的行号.这使得几乎不可能查明各种崩溃.
在过去的某个时刻,我的proguard混淆停止了正常工作,或者看起来如此.在以下日志文件片段中,请注意我的标识符BasicList和ImageClick正在文件中显示.然而,很明显Proguard正在运行,因为存在着歧视.
其次,对于BasicList行,它显示的行号为6218.我的源文件没有接近那么多行的位置.需要明确的是,它也不是一个角色.
E/InputEventReceiver( 3814): Exception dispatching input event.
E/MessageQueue-JNI( 3814): Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI( 3814): java.lang.NullPointerException
E/MessageQueue-JNI( 3814):  at com.perinote.perinote2.BasicList.a(SourceFile:6218)
E/MessageQueue-JNI( 3814):  at com.perinote.perinote2.ae.onClick(SourceFile:266)
E/MessageQueue-JNI( 3814):  at android.view.View.performClick(View.java:4240)
E/MessageQueue-JNI( 3814):  at com.perinote.widgets.ImageClick.onTouchEvent(SourceFile:1156)
E/MessageQueue-JNI( 3814):  at android.view.View.dispatchTouchEvent(View.java:7384)
E/MessageQueue-JNI( 3814):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
Run Code Online (Sandbox Code Playgroud)
我的proguard-project.txt有以下内容
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-assumenosideeffects class android.util.Log { ... stuff ... }
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
找到两个解决方案 - 请参阅选定的答案
当用户点击EditText的某个区域时,我想弹出一个对话框.我使用onClick来捕获点击.这部分工作:用户第一次点击EditText时,弹出软键盘而对话框不弹出.随后的点击会弹出键盘,然后是对话框(键盘会消失).
我怀疑这与EditText获得关注有关.
这是一个代码片段:
public class PrefixEditText extends EditText implements TextWatcher, OnClickListener
{
  public PrefixEditText (Context context)
  {
    super (context);
    setOnClickListener (this);
  }
  @Override
  public void onClick(View v)
  {
    int selStart = getSelectionStart();
    if (selStart < some_particular_pos)
      bring_up_dialog();
  }
}
Run Code Online (Sandbox Code Playgroud)
重要说明:我不想完全禁用正常的EditText行为.我希望用户能够进行区域选择(用于复制和粘贴).我可能仍然希望它获得焦点(因此当具有物理键盘的人使用该应用程序时,我不打破模型).点击可以设置光标位置.因此,覆盖onTouch并阻止EditText中所有onTouch操作的解决方案对我来说不起作用.
更新 我发现了一点.如果EditText正在获得焦点,则会调用onFocusChange而onClick不会.如果它已经有焦点,则onClick被调用而onFocusChange没有.
其次,可以通过调用隐藏键盘
setInputType (InputType.TYPE_NULL);
Run Code Online (Sandbox Code Playgroud)
在onFocusChange中这样做 - 键盘永远不会出现.在onClick中这样做(假设键盘在点击之前被隐藏)显然为时已晚 - 键盘显示然后消失.
下一个尝试的想法是在onTouch期间隐藏键盘.但是,我害怕弄乱那些代码 - 似乎无论我想出什么都会对EditText的未来版本非常脆弱.
对此有何看法?
我正试图从我的Android应用程序中去除堆栈跟踪.我在构建应用程序时使用了proguard,并且运行回溯似乎工作,或多或少.
什么是行不通的是解码行号.输出中没有显示行号,它列出了每个"at"的几个选项.
这是我的proguard-project.txt文件:
-keepattributes LineNumberTable
-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int d(...);
}
Run Code Online (Sandbox Code Playgroud)
这是我的堆栈跟踪:
uncaught exception
java.lang.NullPointerException
at com.myapp.myapp.dbaccess.ag.a(Unknown Source)
at com.myuapp.myapp.dbaccess.x.a(Unknown Source)
at com.myapp.myapp.dbaccess.x.a(Unknown Source)
at com.myapp.myapp.main.ab.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
这是输出:
uncaught exception
java.lang.NullPointerException
at com.myapp.myapp.dbaccess.ZNodeCache.com.myapp.myapp.dbaccess.ZNode getNodeFromCache(long)(Unknown Source)
                                             com.myapp.myapp.dbaccess.ZRoot getRootFromCache()
                                             com.myapp.myapp.dbaccess.ZNode getNodeFromDb(long,boolean)
                                             com.myapp.myapp.dbaccess.ZNode$Array getChildrenForExport(com.myapp.myapp.dbaccess.ZNode)
                                             ... many more ...
at com.myapp.myapp.dbaccess.XmlImport.com.myapp.myapp.dbaccess.XmlImport$Results importFile(java.lang.String)(Unknown Source)
                                            void _doImport(java.io.InputStream,com.myapp.myapp.dbaccess.XmlImport$Results)
                                            void importFile(java.io.InputStream)
                                            void importNode(org.xmlpull.v1.XmlPullParser,com.myapp.myapp.dbaccess.ZNode)
                                             ... many more ...
at com.myapp.myapp.dbaccess.XmlImport.com.myapp.myapp.dbaccess.XmlImport$Results importFile(java.lang.String)(Unknown Source)
                                            void _doImport(java.io.InputStream,com.myapp.myapp.dbaccess.XmlImport$Results)
                                            void importFile(java.io.InputStream)
                                            void importNode(org.xmlpull.v1.XmlPullParser,com.myapp.myapp.dbaccess.ZNode)
                                             ... many more ... …Run Code Online (Sandbox Code Playgroud) 我正在使用CalendarContract.Instances来获取一组日历事件.一般来说,我的查询工作正常.但是,"假期"日历中事件的开始和结束时间将返回错误的时区.我个人日历中的活动来自正确的时间.
例如:
New Year's day "begins" at 04:00 PM, 31 Dec 2014.
Run Code Online (Sandbox Code Playgroud)
在哪里
Opera "begins" at 02:00 PM, 11 Jan 2015.
Run Code Online (Sandbox Code Playgroud)
我使用完全相同的代码来显示两者:
  SimpleDateFormat formatter = new SimpleDateFormat ("hh:mm a, d MMM yyyy", Locale.US);
  logD (prefix + i + ": " + formatter.format (data.startTime) + "; " + data.note);
Run Code Online (Sandbox Code Playgroud)
data.startTime映射到Instances.BEGIN,data.note映射到Instances.TITLE.歌剧院正好在正确的时间出现,新年的一天显然是8小时(我在美国太平洋时区).
如果我在Android日历应用中查看这些内容,则会显示正确的时间.
显然,我可以查看事件来自哪个日历,并相应地设置时区以使其显示正确的时间.但是,我希望有一个我不知道的更合适的解决方案.
这是从代码中获取事件值的代码片段:
@Override
public View getView (int position, View convertView, ViewGroup parent)
{
  ...
  EventFields fields = new EventFields();
  cursor.moveToPosition (position);
  fields.title = cursor.getString (cursor.getColumnIndex (Instances.TITLE));
  fields.dtStart = cursor.getLong (cursor.getColumnIndex …Run Code Online (Sandbox Code Playgroud) 我正在创建一个带代码的WebView,而不是通过XML布局加载.webview似乎已正确创建,但我看到错误:
W/AwContents( 4564): nativeOnDraw failed; clearing to background color.
I/chromium( 4564): [INFO:CONSOLE(1)] "Uncaught ReferenceError: Android is not defined", 
...
Run Code Online (Sandbox Code Playgroud)
如果我将WebView放在我的XML布局中,我就不会收到这些错误.请注意,如果脚本运行,它会将onLoadEvent字段值从"no"更改为"yes".这种情况正在发生,因此显然脚本正在运行.但是,它并没有获取用户名和密码,表明"Android" " 没有定义.
我也尝试在webView.loadData()之前执行addView(); 同样的错误.
这是创建WebView的代码:
  @SuppressLint("SetJavaScriptEnabled")
  private void onOk ()
  {
    Log.d ("RegTest", "onOk");
    webView = new WebView (this);
    webView.setLayoutParams (new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT));    
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled (true);
    CharSequence cs = readAsset ("input_form");
    webView.loadData (cs.toString(), "text/html", "UTF-8");
    contentView.addView (webView);
  }
Run Code Online (Sandbox Code Playgroud)
这里是"input_form"的剪辑,它是WebView内容的来源:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  ...
  <script type="text/javascript">
    function onLoadValues () …Run Code Online (Sandbox Code Playgroud) 我的调试版本未安装在某些早期设备上。在安装过程中,Android 会记录一个错误,例如:
java.lang.SecurityException:META-INF/CERT.SF 的摘要无效...
我很确定这与在签署调试 APK 时使用 SHA1 与 SHA256 有关。它可以安装在 Android 5 及更高版本上,但不能安装在 Android 4.1 上。我的版本在两者上构建安装,我指定同时使用 V1 和 V2 签名。
最近当我更新我的开发环境时,这个问题开始出现。我意识到 v2 签名已经存在了一段时间,但显然在我之前的更新中有些东西“卡在了过去”,直到现在才真正使用 v2 签名。
以下是早期版本的 CERT.SF 中的几行代码,该版本安装在 Android 4.1 上:
Signature-Version: 1.0
X-Android-APK-Signed: 2
SHA1-Digest-Manifest: 5uKyIdhWpwJ5DqL2eY6yywRve60=
Created-By: 1.0 (Android)
Name: res/drawable-hdpi-v4/task_priority_full_mask.png
SHA1-Digest: mgbQEI7yIlWN/S81eXILs9yQsx0=
Name: res/layout/intrinsic_calendar_item.xml
SHA1-Digest: fDHWqyZu4G7746oUndD2w3+SEpU=
Name: res/drawable-hdpi-v4/call_outgoing.png
SHA1-Digest: qjFodzSd/IiusVuP/fmJp8AMwpM=
Run Code Online (Sandbox Code Playgroud)
而且,这是新的 CERT.SF 中的几行,它安装失败:
Signature-Version: 1.0
X-Android-APK-Signed: 2
SHA-256-Digest-Manifest: oYH6iW7P/SZv6wI2m3sLn/GAfEtKxfO8gok/TVB6n1Y=
Created-By: 1.0 (Android)
Name: res/drawable-hdpi-v4/task_priority_full_mask.png
SHA-256-Digest: LfLVegeMx7B2i8CF5ctrZ+Ab2FHqlpxVPJgsgojbp6A=
Name: res/layout/intrinsic_calendar_item.xml
SHA-256-Digest: 5hrCEplQJgsiRbbJssNvd8faCTkHGAmAptub/ZPHPdk=
Name: res/drawable-hdpi-v4/call_outgoing.png
SHA-256-Digest: EXwgtHDkKbPUezjL9rOuuButu4w7E6e5r9YMTGxQhh8=
Run Code Online (Sandbox Code Playgroud)
请注意,新版本具有 SHA-256 摘要,而旧版本具有 …
如何设置元素的位置?当用户拖动元素(图像)时,我希望它同步移动。我看到正在调用我的“mousemove”处理程序。但是我无法让元素实际移动。
这是 mousemove 处理程序(被拖动的元素是“overlay”):
function handleMouseMove (event)
{
  var deltaX = event.movementX;
  var deltaY = event.movementY;
  var divOverlay = document.getElementById ("overlay");
  var rect = divOverlay.getBoundingClientRect();
  divOverlay.style.left = rect.x + deltaX;
  divOverlay.style.top = rect.y + deltaY;
}
Run Code Online (Sandbox Code Playgroud)
这是“叠加”的 html:
<div id="overlay">
  ... some other stuff ...
  <img id="large" src="something.jpg" >
</div>
Run Code Online (Sandbox Code Playgroud)
和CSS:
#overlay {position:absolute; left:0; top:0}
Run Code Online (Sandbox Code Playgroud)
似乎默认的拖动动作出现了,这是一个随鼠标移动的“叠加”阴影。但是元素本身不会移动。
我一定忽略了一些明显的东西,但我还没有弄清楚如何使用 Android Studio 3.5 中的分析器。
我尝试选择“示例 java 方法”和“跟踪 java 方法”,但没有看到如何显示调用堆栈进程和 cpu 时间。
启动分析器后,似乎当我点击“+”并附加到我的应用程序时,它会立即开始录制。我看到的唯一停止按钮是左上角区域的红色按钮,用于停止当前的分析会话。我试过点击它,这会停止主窗口中的时间进程。然后,我单击 CPU 区域,图形区域下方会出现一些标题,包括“调用图表”。单击“呼叫图表”什么也不做,屏幕的其余部分是空白的。
我也尝试了一种稍微不同的方法。首先,点击“+”附加到我的应用程序。然后,单击图形区域。那时,我得到“记录”按钮。我点击它,它变成了一个停止按钮。片刻之后,我点击了“停止”按钮。该图显示了一个阴影区域,它大概对应于开始和停止之间的样本。但是单击该区域或其他任何地方似乎没有任何效果。
我错过了什么?谢谢。