如何在Android中获得可用的屏幕高度?我需要高度减去状态栏/菜单栏或可能在屏幕上的任何其他装饰,我需要它适用于所有设备.另外,我需要在onCreate函数中知道这一点.我知道之前已经问过这个问题,但我已经尝试过他们的解决方案而且没有一个能够工作.以下是我尝试过的一些事情:
我已经在API 7-17上测试了这个代码.不幸的是,在API 13上,水平和垂直底部都有额外的空间,而在API 10,8和7上,水平和垂直底部都没有足够的空间.(我没有测试过时的API):
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
TypedValue tv = new TypedValue();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
screenHeight -= TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
screenHeight -= getResources().getDimensionPixelSize(resourceId);
Run Code Online (Sandbox Code Playgroud)
这不考虑状态栏/菜单栏:
Display display = getWindowManager().getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
Run Code Online (Sandbox Code Playgroud)
这也不是:
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
screenWidth = size.x;
screenHeight = size.y;
Run Code Online (Sandbox Code Playgroud)
这不是:
Point size = new …Run Code Online (Sandbox Code Playgroud) 编辑
请参阅我的答案以获得完整的解决方案:
我设法通过使用UITextView而不是a 来解决这个问题UILabel.我写了一个类,使UITextView行为像一个UILabel但具有完全准确的链接检测.
我已经成功设置了链接的样式而没有使用问题,NSMutableAttributedString但我无法准确地检测到哪个字符已被点击.我已经尝试了这个问题中的所有解决方案(我可以转换为Swift 4代码),但没有运气.
以下代码有效,但无法准确检测单击了哪个字符并获取了链接的错误位置:
func didTapAttributedTextInLabel(label: UILabel, inRange targetRange: NSRange) -> Bool {
// Create instances of NSLayoutManager, NSTextContainer and NSTextStorage
let layoutManager = NSLayoutManager()
let textContainer = NSTextContainer(size: CGSize.zero)
let textStorage = NSTextStorage(attributedString: label.attributedText!)
// Configure layoutManager and textStorage
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
// Configure textContainer
textContainer.lineFragmentPadding = 0.0
textContainer.lineBreakMode = label.lineBreakMode
textContainer.maximumNumberOfLines = label.numberOfLines
let labelSize = label.bounds.size
textContainer.size = labelSize
// Find the tapped …Run Code Online (Sandbox Code Playgroud) 更新资料
我解决了问题并发布了答案。但是,我的解决方案并非100%理想。我宁愿只symlink从cachewith clearstatcache(true, $target)或中删除,clearstatcache(true, $link)但那不起作用。
我还宁愿首先避免对符号链接进行缓存,也可以在生成符号链接后立即将其从缓存中删除。不幸的是,我没有运气。由于某些原因clearstatcache(true),创建符号链接后无法正常工作,但仍会对其进行缓存。
我会很高兴地将悬赏奖励给任何能够改善我的答案并解决这些问题的人。
编辑
我试图通过每次clearstatcache运行时生成一个文件来优化我的代码,因此我只需要为每个符号链接清除一次缓存。由于某些原因,这不起作用。clearstatcache每次symlink在路径中包含a时都需要调用它,但是为什么呢?必须有一种方法可以优化我拥有的解决方案。
我使用PHP 7.3.5带nginx/1.16.0。有时file_get_contents在使用时会返回错误的值symlink。问题是删除并重新创建符号链接后,其旧值保留在缓存中。有时返回正确的值,有时返回旧值。它似乎是随机的。
我试图用以下方法清除缓存或防止缓存:
function symlink1($target, $link)
{
realpath_cache_size(0);
symlink($target, $link);
//clearstatcache(true);
}
Run Code Online (Sandbox Code Playgroud)
我并不是真的想要禁用缓存,但是我仍然需要100%的file_get_contents精度。
编辑
我无法发布我的源代码,因为它太长且太复杂了,所以我创建了一个最小的,可重现的示例(index.php),该示例再次出现了问题:
<h1>Symlink Problem</h1>
<?php
$dir = getcwd();
if (isset($_POST['clear-all']))
{
$nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
foreach ($nos as $no)
{
unlink($dir.'/nos/'.$no.'/id.txt');
rmdir($dir.'/nos/'.$no);
}
foreach (array_values(array_diff(scandir($dir.'/ids'), array('..', '.'))) as $id)
unlink($dir.'/ids/'.$id);
}
if …Run Code Online (Sandbox Code Playgroud) 当我在模拟器中旋转设备时,我在控制台中收到以下消息:[App] if we're in the real pre-commit handler we can't actually add any new fences due to CA restriction.
有很多关于如何抑制警告的信息,例如在这个问题中.然而,似乎这只是在没有实际解决任何问题的情况下踩到问题.
警告究竟意味着什么,我该如何解决?
如何在Linux中更改.eclipse文件夹?我尝试添加这一行:
-Dosgi.configuration.area=/directory/directory1/eclipse/.eclipse
Run Code Online (Sandbox Code Playgroud)
在eclipse.ini的顶部,但它不起作用.我也尝试将它添加到eclipse.ini中的其他各个地方,但仍然没有运气.
我添加了这一行:
-Dosgi.configuration.area=file:/directory/directory1/eclipse/.eclipse
Run Code Online (Sandbox Code Playgroud)
紧接着-vmargs.当Eclipse启动时,它现在从正确的.eclipse位置读取,如果.eclipse不存在,则创建它.不幸的是,在Eclipse加载之后,在我的主文件夹中创建了另一个.eclipse文件夹,然后Eclipse继续从该文件夹中读取.我怀疑我的eclipse.ini文件现在是正确的,但还有另一个我需要更改的文件.
我的HTML5号码字段一直出现奇怪的意外验证错误.这是我的HTML代码:
<input type="number" name="width" maxlength="5" placeholder="Width" value="733.95591182365" /> Width<br />
Run Code Online (Sandbox Code Playgroud)
当我输入500并提交表格时,我收到错误:"请输入有效值.两个最接近的有效值是499.95591182365和500.95591182365."
我已经解决了这个问题.问题是这个value="733.95591182365".我已将PHP代码更改为将小数舍入为整数,以便只能将整数回显到数字字段中.现在我只在输入小数时才收到错误,这没关系.
如何在Android中获得可用的屏幕高度?我需要高度减去状态栏/菜单栏或可能在屏幕上的任何其他装饰,我需要它适用于所有设备.另外,我需要在onCreate函数中知道这一点.我知道之前已经问过这个问题,但我已经尝试过他们的解决方案而且没有一个能够工作.以下是我尝试过的一些事情:
这不考虑状态栏/菜单栏:
Display display = getWindowManager().getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
Run Code Online (Sandbox Code Playgroud)
这也不是:
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
screenWidth = size.x;
screenHeight = size.y;
Run Code Online (Sandbox Code Playgroud)
这不是:
Point size = new Point();
getWindowManager().getDefaultDisplay().getRealSize(size);
screenWidth = size.x;
screenHeight = size.y;
Run Code Online (Sandbox Code Playgroud)
这不起作用:
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
// since SDK_INT = 1;
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
try
{
// used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display); …Run Code Online (Sandbox Code Playgroud) 如何将焦点设置为按钮但不将setFocusableInTouchMode设置为true?
我第一次尝试这个:
button.requestFocus();
Run Code Online (Sandbox Code Playgroud)
这根本行不通.然后我尝试了这个:
button.setFocusableInTouchMode(true);
button.requestFocus();
Run Code Online (Sandbox Code Playgroud)
问题是,它突出了按钮.我不希望按钮在触摸模式下突出显示.我只想在用户点击回车键或Tab键时选择按钮.
为了澄清,我只是希望第一个按钮在不处于触摸模式时以焦点开始.
编辑
我创建了一个演示项目来Github展示确切的问题。吉特项目。
我写了一个可扩展recyclerView的Kotlin每一行都有一个播放按钮,它使用TextToSpeech. 播放按钮的文本应在播放时更改为停止,然后在播放结束时更改回播放。
当我调用notifyItemChangedinsideonStart和onDoneof 时setOnUtteranceProgressListener,onBindViewHolder不会调用并且 recyclerView 中的行将不再正确展开和折叠。
t1 = TextToSpeech(context, TextToSpeech.OnInitListener { status ->
if (status != TextToSpeech.ERROR) {
t1?.setOnUtteranceProgressListener(object : UtteranceProgressListener() {
override fun onStart(utteranceId: String?) {
recyclerView.adapter.notifyItemChanged(position)
}
override fun onStop(utteranceId: String?, interrupted: Boolean) {
super.onStop(utteranceId, interrupted)
onDone(utteranceId)
}
override fun onDone(utteranceId: String?) {
val temp = position
position = -1
recyclerView.adapter.notifyItemChanged(temp)
}
override fun onError(utteranceId: String?) …Run Code Online (Sandbox Code Playgroud) 如何在Android Kotlin中拨打电话或拨打电话?例如:致电*21*2#