我在我的应用程序中广泛使用RelativeLayouts,并认为我知道如何指定它们,但这让我感到茫然.我基本上将4个TextView放在两行,每行两行,每行包含一个标签和将要提供的文本.它应该看起来像:
出生:1810年8月23日,肯塔基州梅森公司
死了:1865年7月15日辛辛那提,俄亥俄州汉密尔顿公司
这是布局的相关部分:
<TextView android:id="@+id/birth_lbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/given_layout"
android:layout_alignLeft="@+id/given_layout"
android:layout_marginTop="6dip"
style="@style/label"
android:text="@string/born"
/>
<TextView android:id="@+id/birth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/birth_lbl"
android:layout_alignBaseline="@+id/birth_lbl"
android:layout_marginLeft="10dip"
android:layout_marginRight="6dip"
style="@style/main_text"
android:text="dd Mmm yy"
/>
<TextView android:id="@+id/death_lbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/birth"
android:layout_alignLeft="@+id/birth_lbl"
android:layout_marginTop="4dip"
style="@style/label"
android:text="@string/died"
/>
<TextView android:id="@+id/death"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/death_lbl"
android:layout_alignLeft="@+id/birth"
android:layout_alignBaseline="@+id/death_lbl"
android:layout_marginRight="6dip"
style="@style/main_text"
android:text="dd Mmm yy"
/>
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这显示出生线视图上方的死亡线视图!如果我将death_lbl视图的规格更改为'layout_below ="@ + id/birth_lbl"',则行正确定位!但是,"出生"视图可以换行到多行,所以我真的需要将第二行放在"出生"下面,而不是"birth_lbl".
有人知道这种行为的原因吗?它出现在Eclipse的Graphical Layout编辑器和运行Android 4.0的平板电脑的运行时.
我的应用程序要求使用手动将文件从PC复制到我的应用程序在其中创建的子目录中的SD卡(或者我将在根目录中查找它).到目前为止,这么好(大多数人没有问题,除非他们试图在手机仍然连接时运行我的应用程序,然后问为什么它告诉他们"SD卡未安装":-)).
无论如何,我想知道三星Galaxy手机是如何工作的,因为我的理解是他们有一个外部和内部SD卡.我的应用程序当前调用"Environment.getExternalStorageDirectory()"; 这会返回EXTERNAL卡的根目录吗?
此外,当用户将设备安装到他们的PC上时,它看起来像什么?他们是看到两个已安装的驱动器,还是仅将外部卡作为驱动器或其他内容?
如果我将简单的HTML格式标记(例如<b> ... </ b>)放入字符串资源并在TextView中显示字符串,则会应用预期的格式.但是,如果我构建自己的String并显示它,我该怎么做呢?如果我执行类似String str ="This is <b> bold </ b>";,则会显示实际标记 - 而不是预期的粗体.
我是否必须通过其他方法运行字符串才能将标记识别为标记?
到目前为止,我已经使用Eclipse开发了一个产品,但现在我开始了另一个完全独立的项目(都是Android应用程序).那么在自己的工作空间中开发每个项目的常见做法是什么?
我对Eclipse并不是非常熟悉,但它似乎通过搜索工作区内的所有项目来做一些事情,这似乎使它们彼此之间不那么独立.配置我的开发的最佳方法是什么?
我有一些客户自愿将我的应用程序的字符串翻译成他们的母语.当然他们不会使用Eclipse Android环境来执行此操作,那么基于Windows的工具/编辑器适合用于处理我发送的XML文件?
当Android设备倾斜并从纵向模式转换为横向模式时,DisplayMetrics对象中返回的值(即来自getDisplayMetrics())是否反映出widthPixels现在具有更大的尺寸,而heightPixels更小?
如果我的目标SDK设置为11并且我使用的是Theme.Holo.NoActionBar,有没有办法让我的菜单出现?我正在使用Theme.Holo用于平板电脑等大屏幕,但纯粹为了节省屏幕空间,我不想在智能手机上显示Action Bar.
但是,我不知道在这种情况下是否会出现某种"软"菜单按钮,就像针对早期版本的应用程序一样.我不确定模拟器是否显示真实的设备屏幕布局,而且我没有4.0手机(即Nexus)可以试用(我必须等待一段时间才能获得一个,除非AT&T最终获得Nexus).
在片段的视图中,我想根据包含视图的宽度调整其中一个子视图的布局参数,其布局参数设置为match_parent.我需要做的是为父级调用getWidth/getHeight,然后设置子视图的ViewGroup.LayoutParameters等.
问题是getWidth只会在第一次绘制布局后返回一个有效值,我不确定是否有任何可用于执行此操作的片段覆盖.例如,调用onCreateView或onStart时,不确定视图的实际宽度.
那么有没有一种直接的方法来实现它,或者我将不得不继承视图并覆盖onLayout或onMeasure?
这已经在以前一般性地讨论过了,但我现在有一个特定的案例.我的应用程序打开一个特定的特定于应用程序的文件类型(.gedstar),它实际上是一个SQLite数据库,通常作为带有pathPattern限定符的application/octet-stream处理.这是我的意图定义:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file"
android:mimeType="application/octet-stream"
android:pathPattern=".*\\.gedstar"
android:host="*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file"
android:mimeType="*/*"
android:pathPattern=".*\\.gedstar"
android:host="*" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
(我已经拥有和没有通配的mimeType,BTW).到目前为止,我一直建议使用Dropbox将文件从用户的PC传输到Android并启动我的应用程序,直到最近才开始使用.然后,随着Dropbox V2.0应用程序的发布,它崩溃了,导致关于没有这个文件类型的应用程序的Toast消息.
使用Logcat捕获它,这是不起作用的意图,它看起来像我应该:
I/ActivityManager(97):开始活动:Intent {act = android.intent.action.VIEW dat = file:///mnt/sdcard/Android/data/com.dropbox.android/files/scratch/GedStar%20Pro/ Gordon.gedstar typ = application/octet-stream flg = 0x10000003(有额外的)}
奇怪的是,我可以使用Dropbox的浏览器界面下载相同的文件,然后转到浏览器的下载列表并成功启动它.这是成功的意图:
I/ActivityManager(97):启动活动:Intent {act = android.intent.action.VIEW dat = file:///mnt/sdcard/download/Gordon.gedstar typ = application/octet-stream flg = 0x10000000 cmp = com .ghcssoftware.gedstar/.GedStar}
我看到的唯一区别是"flg"的值和"cmp ="值,我假设是因为ActivityManager找到了匹配的意图.任何人都能更充分地解释这个吗
几年前,当我实现我的窗口小部件时,我使用了开发站点上的“应用程序窗口小部件”页面(仍然存在)中的以下建议:“如果您的应用窗口小部件设置过程可能需要几秒钟(也许在执行Web请求时),并且您需要您的过程继续进行,请考虑使用onUpdate()方法启动服务。” 我做到了,当为多达25个SDK开发时,它就像一个魅力。
它也可以在Android 8.0上运行,但是当我的目标是26时,该应用在发出startService调用时便开始在小部件提供商的onUpdate方法中崩溃。该错误消息与尝试从另一个后台服务启动后台服务有关,尽管我尝试了清单中服务定义中的一些操作,但无法使它正常工作。
当我确定确实不需要从服务中更新窗口小部件时,我最终做了一个解决方法,因此现在直接在onUpdate中进行更新即可。服务和背景/前景问题我并没有太多困扰,但是我仍然想知道是否有一种方法可以继续使用服务来更新小部件。