Android Material Design规范称"类型与4 dp基线网格对齐."(http://www.google.com/design/spec/layout/metrics-and-keylines.html#)
它还在示例图形中说明列表中的行应该是72dp高.
它还表示不同的字体样式以及字体的大小和主要内容(http://www.google.com/design/spec/style/typography.html#typography-standard-styles).
我正在尝试将所有这些规则应用到我的应用程序中以调整列表中的行的布局,但是我不知道如何将行中的文本框分开.
我的每一行都有3行文字显示
标题线一个尺寸14sp细节线两个尺寸12sp细节线三个尺寸12sp
如何确保每个文本框中文本的基线与网格对齐?我不能对齐文本框的底部,因为这不是基线,文本框的底部是基线+下降不是吗?
我需要尽可能均匀地分隔3行文本,但要确保它们的基线与网格对齐.
我不相信我可以简单地使用填充/边距,因为这不会确保每行文本的基线与网格对齐.
此外,当我进行所有这些计算时,我需要确保行高为72dp(对于指定了正常字体大小的mdpi设备).
最后,我将如何指定领先?据我所知,这是从上面一行文本的基线到底行最高文本顶部的空间.再次,我不能使用填充/边距,因为这不是从基线.

编辑:列表的材料规范有更多信息,说明当您有3行文本时,列表中的图块应如何显示.http://www.google.co.uk/design/spec/components/lists.html#lists-keylines
但它仍然没有说明3行文本是如何实际垂直放置的,以便它们的基线在4dp网格上对齐.

我的要求
注意:我需要支持Android API 15及更高版本.
在我的PreferenceFragment中,我正在将PreferenceScreen动态添加到PreferenceCategory.
PreferenceScreen as = mgr.createPreferenceScreen(context);
as.setTitle(name);
myCategory.addPreference(as);
Run Code Online (Sandbox Code Playgroud)
当设置活动呈现时,这些PreferenceScreens仅在其行的标题中呈现,请参见下图.

我想自定义此行中显示的内容.理想情况下,我希望在下面有一个摘要标题,标题/摘要左侧的图标和右侧的某些行上的图标.请参阅下面的模型图像.

PreferenceScreen.setWidgetLayoutResource(int widgetLayoutResId)
我知道我可以使用"setWidgetLayoutResource"在我的设置活动中使用以下代码在行布局的右侧添加一个图标(以及带有"setSummary"的摘要)
PreferenceScreen as = mgr.createPreferenceScreen(context);
as.setTitle(name);
as.setSummary(summary);
as.setWidgetLayoutResource(R.layout.as_widget);
myCategory.addPreference(as);
Run Code Online (Sandbox Code Playgroud)
其中"as_widget.xml"是
<?xml version="1.0" encoding="utf-8"?>
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_action_favorite"/>
Run Code Online (Sandbox Code Playgroud)
这将产生如下的UI

这让我更接近我想要的但仍然不完全是我想要的(错过了行开头的图标).
PreferenceScreen.setLayoutResource(int layoutResId)
我相信如果我使用它,那么我可以控制整行的渲染.我在stackoverflow上看过这个例子,比如
根据我的理解,您指定的布局文件必须具有以下内容
然而,当我尝试这样做时,Android Studio突出显示"@ + android:id/summary",错误为"无法解析符号'@ + android:id/summary'.当应用程序运行时,我的行呈现为完全空白.
我的java是
PreferenceScreen as = mgr.createPreferenceScreen(context);
as.setTitle(name);
as.setSummary(summary);
as.setLayoutResource(R.layout.as_row_layout);
myCategory.addPreference(as);
Run Code Online (Sandbox Code Playgroud)
我的布局是
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/widget_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingRight="?android:attr/scrollbarSize">
<ImageView
android:id="@+id/icon1"
android:src="@drawable/ic_action_email" …Run Code Online (Sandbox Code Playgroud) 我使用 Vue CLI 创建了一个 Vue3 应用程序,以使用 Vuex 和路由器创建我的应用程序。该应用程序运行良好。
注意:我使用 Vue3 https://blog.logrocket.com/using-vuex-4-with-vue-3/在 Vuex 中遵循了这个有用的文档
需求现在我想更改我的 Vue3 应用程序以支持服务器端渲染(即 SSR)。
我观看了这个关于使用 Vue3 创建 SSR 应用程序的精彩视频:https : //www.youtube.com/watch? v = XJfaAkvLXyU ,我可以像视频中一样创建和运行一个简单的应用程序。但是,当我尝试将它应用到我的主要 Vue3 应用程序时,我被卡住了。
我目前的症结是如何在服务器代码上指定路由器和 vuex。
我的代码
客户端入口文件(src/main.js)有以下内容
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
createApp(App).use(store).use(router).mount('#app');
Run Code Online (Sandbox Code Playgroud)
服务器入口文件(src/main.server.js)目前有以下内容
import App from './App.vue';
export default App;
Run Code Online (Sandbox Code Playgroud)
在快速服务器文件 (src/server.js) 中,它当前具有
const path = require('path');
const express = require('express');
const { createSSRApp } = …Run Code Online (Sandbox Code Playgroud) 需求
如何创建看起来像这样的视图.
我想在屏幕上绘制一个视图,该视图分为几段,显示整个视图的值百分比.我的要求是
我想过的想法/事情
(1)自定义视图并排渲染3个矩形
我尝试了一个自定义视图,它可以并排显示3个矩形.但这些显然有方角.
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int viewHeight = 50;
canvas.drawrect(0, 0, 60, viewHeight, paint); // A
canvas.drawrect(60, 0, 120, viewHeight, paint); // B
canvas.drawrect(120,0, 180, viewHeight, paint); // C
}
Run Code Online (Sandbox Code Playgroud)
(2)圆角形状
我知道我可以使用Shape来定义带有圆角的矩形,但是这是一种颜色.
<shape xmlns:android="http://schemas.android.com/apk/res/android">
...
<corners
android:radius="4dp" />
....
</shape>
Run Code Online (Sandbox Code Playgroud)
(3)层列表
从具有两种不同颜色的Android矩形形状,我看到我可以使用图层列表来指定形状中的每个项目以具有不同的颜色.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<size
android:width="40dp"
android:height="40dp" />
<solid android:color="#F86F05" />
</shape>
</item>
<item android:top="10dp">
<shape android:shape="rectangle">
<size
android:width="30dp" …Run Code Online (Sandbox Code Playgroud) 我正在开发我的第一个 NextJS 应用程序。当我运行“npm run dev”或“npm run start”时,它会将我的应用程序部署到
http://host:port/
Run Code Online (Sandbox Code Playgroud)
当我导航到一个页面时,网址变为
http://host:port/page1
Run Code Online (Sandbox Code Playgroud)
我需要有自己的特定网址,例如
http://host:port/my-test-application/path-for-my-app/
http://host:port/my-test-application/path-for-my-app/page1
Run Code Online (Sandbox Code Playgroud)
此外,我的应用程序有很多元素可以链接到应用程序的其他区域,我需要这些元素也可以使用 basePath 转到 URL 而不仅仅是转到根路径。
我还将将此应用程序部署到具有不同 basePath 的不同服务器,因此无法在我的应用程序中进行硬编码。
我怎样才能做到这一点?
对于其他应用程序,例如 react/vue/angular/native JS,我只需构建我的应用程序并将构建代码放在我的服务器上的“my-test-application/path-for-my-app”文件夹中。
我用我的 NextJS 应用程序尝试过这个,但我收到一个错误,说找不到“.next”文件夹。
我用谷歌搜索,可以找到一些使用“assetPrefix”或使用“Zones”的参考。但是,我真的不明白我应该做什么。
如何将我的应用程序部署到特定 URL
解决方案 1:重组“页面” - 无法部署到具有不同 basePaths 的不同服务器
我可以在“pages”目录中创建文件夹结构并更改我的所有元素以使用此文件夹结构。
|- pages
|- my-test-application
|- path-for-my-app
|- index.js
|- page1.js
<Link href="/my-test-application/path-for-my-app/page1" >
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个解决方案,因为 basePath 被硬编码到我的应用程序中,与部署设置相关。
如果我想将我的应用程序部署在具有不同 basePaths(即下面)的 2 个服务器上,我将必须有 2 个版本的代码。
http://host:port/my-test-application_1/path-for-my-app/page1
http://host:port/my-test-application_2/diff-path-for-my-app/page1
Run Code Online (Sandbox Code Playgroud)
更新:我在 3 月 5 日更新了这个问题,包括我对 s 工作的需求和我不喜欢的一个解决方案。
默认情况下,Accessibility Services将为EditText视图读出以下内容
我希望它能在两种情况下读出完全不同的东西.
我的xml片段是
<EditText
android:id="@+id/my_edit_text"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:editable="false"
android:focusable="true"
android:hint="my hint text"/>
Run Code Online (Sandbox Code Playgroud)
我必须支持API 14及更高版本.
我不想为这一个案例扩展EditText,因此我使用的是AccessibilityDelegate.
mEditTextView.setAccessibilityDelegate(accessibilityDelegate);
Run Code Online (Sandbox Code Playgroud)
从文档中我了解到,在我的委托中,我只需要在委托中覆盖我想要改变行为的那些方法.所有其他方法将默认为View的实现.
http://developer.android.com/reference/android/view/View.AccessibilityDelegate.html http://developer.android.com/reference/android/view/View.html
"onPopulateAccessibilityEvent"的文档说:" 给主机View一个机会用它的文本内容填充辅助功能事件. ""dispatchPopulateAccessibilityEvent"的文档说:" 首先向主机View调度AccessibilityEvent,然后调用它的子节点将他们的文本内容添加到事件. "并且默认行为是为视图本身调用"onPopulateAccessibilityEvent",然后在其所有子节点上调用"dispatchPopulateAccessibilityEvent"
http://developer.android.com/guide/topics/ui/accessibility/apps.html
这个文档在"onPopulateAccessibilityEvent"下说"*如果你的这个事件的实现完全覆盖输出文本而不允许你的布局的其他部分修改它的内容,那么不要在你的代码中调用这个方法的超级实现."
因此,我的代表如下
View.AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() {
@Override
public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
event.getText().add("Apples");
}
};
Run Code Online (Sandbox Code Playgroud)
为什么当我使用键盘导航或使用屏幕点击EditText视图时,它仍在阅读"我的提示文本"而不是"苹果"?
如果我使用调试器,我看到在设置事件文本之前,文本为空,在我设置之后,它是"Apples"但是TalkBack仍然会读出提示.
奇怪的是,如果我覆盖"onInitializeAccessibilityNodeInfo"并发送带有我想要的文本的事件,那么这个所需的文本会被读出(参见下面的代码片段).但这对我来说似乎是错误的,因为"onInitializeAccessibilityNodeInfo"正在对EditText的事件作出反应,但后来只是提出了一个新事件.
@Override
public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info){
super.onInitializeAccessibilityNodeInfo(v, info);
...
final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
event.getText().add("Pears");
event.setClassName(className);
event.setPackageName(packageName);
...
v.getParent().requestSendAccessibilityEvent(v, event);
}
Run Code Online (Sandbox Code Playgroud) 我对编写 Next.js 应用程序感到困惑,当我有可重用的组件和<Link>s 导航到应用程序的其他区域时,该应用程序将在服务器端呈现页面。
文档说
getInitialProps(SSR)只为页面调用,不为组件调用”componentWillMount在不执行服务器端,它的客户端只渲染<Link> 标签只是客户端导航,因此它导航到的“页面”在客户端呈现我不清楚以下几点:
<Link>应用程序的其他页面有s,其他页面如何在服务器上呈现?<Link>s 是客户端,这当然意味着只有初始页面会在服务器端呈现,那么用 Nextjs 而不是普通的 React 编写应用程序有什么意义呢?getInitialProps只为页面调用,当然这意味着页面getInitialProps必须为在其页面上呈现的任何数据执行所有服务器调用,然后发送到子组件,这肯定非常慢。如果一个页面包含一个项目列表,将会有一个服务器调用来获取项目列表,对于列表中的每个项目,需要一个调用来获取项目详细信息,另一个调用来获取项目图片。这是在呈现页面之前的大量服务器调用。我认为用我想要做的事情的示例应用程序来说明我的问题会更容易。
这是我的应用程序的图形表示。
所有页面都使用layout-template添加页眉和页脚的主要结构,然后使用组件在页面中间添加自己的内容
|- pages
|- index.js (i.e. tab-1)
|- tab2.js
|- tab3.js
|- tab4.js
|- aitem
|- [id].js
|- numitem
|- [id].js
|- Components
|- …Run Code Online (Sandbox Code Playgroud) 我有一个 React-Native 应用程序,其中使用 FlatList 来显示从服务器获取的项目列表。该列表有 2 列,我需要列表项具有相同的高度。我在渲染列表项的代码周围放置了边框,但列表项的高度不同。我尝试过使用弹性盒设置来使视图填充容器,但我尝试的一切都没有什么区别。
我创建了应用程序的简化版本来说明该问题:
请注意,红色边框区域的高度不同。我需要让它们具有相同的高度。
灰色边框添加在包装负责列表项的组件的视图中,红色边框是负责列表项的组件的根视图。为了清楚起见,请参阅下面的代码。
我无法在应用程序中使用灰色边框,因为我的应用程序显示空框,而负责列表项的组件在呈现自身之前从服务器获取附加信息
此外,我不能使用固定的高度尺寸。
应用项目结构及代码
我的代码以“container.js”结尾的文件从服务器获取数据并将其传递到其匹配的渲染组件的方式进行分割。例如,“MainListContainer”将从服务器获取列表,然后将列表数据传递给“MainList”,“ListItemContainer”将从服务器获取有关单个列表项的附加信息,并将其传递给“ListItem”进行渲染实际项目。我已将此模型保留在我的简化应用程序中,以便它尽可能接近我的实际应用程序。
索引.js
import {AppRegistry} from 'react-native';
import MainListContainer from './app/components/MainListContainer';
import {name as appName} from './app.json';
AppRegistry.registerComponent(appName, () => MainListContainer);
Run Code Online (Sandbox Code Playgroud)
MainListContainer.js
import React from 'react';
import MainList from './MainList';
const data = [
{id: '1', title: 'Item 1', subtitle: 'A', description: 'This is the first item.'},
{id: '2', title: 'Item 2', subtitle: 'B', description: 'The Big Brown Fox Jumped over the lazy dogs. The Big Brown Fox …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的 Kotlin 应用程序编写 Robolectric 测试,但无法运行我的测试,因为它无法下载 Robolectric。我在 StackOverflow 和 Google 上进行了搜索,但没有任何建议可以解决我的问题,因此我在这里提出问题。
\n\n我使用的是Android Studio 3.6
\n\n我看到错误
\n\nDownloading from maven \nDownloading: org/robolectric/android-all/9-robolectric-4913185-2/android-all-9-robolectric-4913185-2.pom from repository sonatype at https://oss.sonatype.org/content/groups/public/\nError transferring file: Connection timed out: connect\n[WARNING] Unable to get resource \'org.robolectric:android-all:pom:9-robolectric-4913185-2\' from repository sonatype (https://oss.sonatype.org/content/groups/public/): Error transferring file: Connection timed out: connect\nDownloading: org/robolectric/android-all/9-robolectric-4913185-2/android-all-9-robolectric-4913185-2.pom from repository central at http://repo1.maven.org/maven2\nError transferring file: Connection timed out: connect\n[WARNING] Unable to get resource \'org.robolectric:android-all:pom:9-robolectric-4913185-2\' from repository central (http://repo1.maven.org/maven2): Error transferring file: Connection timed out: connect\nDownloading: org/robolectric/android-all/9-robolectric-4913185-2/android-all-9-robolectric-4913185-2.jar from repository …Run Code Online (Sandbox Code Playgroud) 我有一个活动,它使用以下代码为整个活动的视图添加自定义视图
activity.getWindow().getDecorView()).addView(newView)
Run Code Online (Sandbox Code Playgroud)
为了显示教练标记/使用标记的屏幕.
我的自定义视图从RelativeLayout扩展而来,在其构造函数中,在屏幕底部添加了一个按钮,当单击该按钮时,将取消视图.
我已经覆盖了"dispatchDraw"方法,以便我可以在特定位置的布局中添加多个coachmark UI对象(textview和bitmaps).这些coachmark对象使用如下代码在视图上绘制自己
canvas.save();
canvas.translate(positioning[0], positioning[1]);
textView.draw(canvas);
canvas.restore();
canvas.save();
canvas.drawBitmap(bitmap, positioning[2], positioning[3], new Paint());
canvas.restore();
Run Code Online (Sandbox Code Playgroud)
ISSUE:启用TalkBack时
然而,当用户按下按钮时,按钮的内容描述被大声读出.
我假设textViews和Bitmaps未被读出的原因是由于我们上面的代码在画布上呈现它们的方式.
问题1:当点击textview和位图时,有没有办法让TalkBack大声说出什么? - 我已经尝试设置contentDescriptions并可以专注于textviews和位图,但这没有任何区别.
问题2:另一种方法是让TalkBack在显示自定义视图时读出内容,并且此文本可以汇总屏幕中显示的所有主题标记.我无法解决如何做到这一点,有没有人有任何建议? - 我已经尝试将我的customView设置为可聚焦(setFocasable(true)并给它一个contentDescription但这不起作用. - 我已经尝试在绘制自定义视图时发起操作,然后向事件添加内容描述但是这个也不起作用,即
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
}
@Override
public void onInitializeAccessibilityNodeInfo (AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
// this is not read out load when the view is displayed, but is read when the view is pressed
info.setContentDescription("on Initialize Accessibility Node Info User Tips");
}
Run Code Online (Sandbox Code Playgroud) 我有一个WebView不受我控制的显示内容。该WebView内容是文件的预览,如PowerPoint文档或PDF文件,word文档等。
当用户更改其设备上的字体大小(设置 -> 辅助功能 -> 字体大小)时,WebView 使用此调整后的字体大小。这会导致 WebView 内容的布局错误并且不再按设计对齐。一个例子是在我的 PowerPoint 演示文稿预览中,文本现在被放大,因此它覆盖了文本右侧的图表,而其他文本则超出了幻灯片的边缘。
如何让 WebView 完全忽略任何系统字体设置,而只使用 HTML/CSS 中为 WebView 中的内容指定的字体大小?
我在堆栈溢出上看到了很多关于如何将字体设置WebView为固定大小的评论,例如:
webView.getSettings().setTextSize(WebSettings.TextSize.NORMAL); // Deprecated
webView.getSettings().setTextZoom(100);
Run Code Online (Sandbox Code Playgroud)
但我不想这样做。我希望字体大小由 HTML/CSS 确定WebView,我永远不会知道 的值,因为 的内容WebView可以是任何东西。
android ×7
next.js ×2
reactjs ×2
talkback ×2
alignment ×1
bitmap ×1
custom-view ×1
customizing ×1
font-size ×1
fonts ×1
grid ×1
javascript ×1
kotlin ×1
layout ×1
preference ×1
react-native ×1
robolectric ×1
router ×1
vue.js ×1
vuejs3 ×1
vuex ×1
webview ×1