我想你已经看到了新的Android设计指南,新的"浮动动作按钮"又名"FAB"
例如这个粉红色的按钮:
我的问题听起来很愚蠢,我已经尝试了很多东西,但是将这个按钮放在两个布局的交叉点上的最佳方法是什么?
在上面的例子中,这个按钮完全位于我们可以想象的ImageView和relativeLayout之间.
我已经尝试了很多调整,但我确信有一个正确的方法来做到这一点.
我试着在这里搜索但找不到答案.
我正在寻找一种从Android Studio中启动Hierarchy Viewer的方法,而不是必须在命令行启动它.我最近从Eclipse迁移到Android Studio,并且该功能在该IDE中的DDMS工具集下可用.
我查看了"Android"工具栏,可以看到屏幕截图功能,但不能查看层次结构查看器.我也在菜单系统中查看了Tools> Android,它也不存在.
我正在使用以下样式和一组九个补丁图像在一些Ice Cream Sandwich选项卡的底部创建一条红线,而不是标准的蓝线:
<style name="customTabStyle" parent="@android:style/Widget.Holo.ActionBar.TabBar">
<item name="android:tabStripLeft">@null</item>
<item name="android:tabStripRight">@null</item>
<item name="android:tabStripEnabled">false</item>
<item name="android:showDividers">none</item>
<item name="android:measureWithLargestChild">true</item>
<item name="android:background">@drawable/tab_line</item>
<item name="android:gravity">center</item>
</style>
<style name="customTabBar" parent="@android:style/Widget.Holo">
<item name="android:showDividers">middle</item>
<item name="android:divider">@drawable/divider2</item>
<item name="android:dividerPadding">0dp</item>
</style>
<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
<item name="android:actionBarTabStyle">@style/customTabStyle</item>
<item name="android:actionBarTabBarStyle">@style/customTabBar</item>
</style>
Run Code Online (Sandbox Code Playgroud)
显示红线,除了标签之间的分隔线外,每条线看起来都很好.正如您在图像中的绿色框内看到的那样,线条未在分隔线下方绘制.如何为此分隔符选择可绘制或样式?
在android:divider
和android:showDividers
物品不负责标签之间的分隔符.它们仅选择在选项卡图标和选项卡标题之间绘制的分隔符.我隐藏了那些分隔线因为没有标题而分隔线看起来很奇怪.
更新在Aneal的回答中,我添加了第二个样式customTabBar.样式选择drawable作为分隔符.分隔线是使用以下9patch drawable创建的纯黑线:
使用此drawable绘制分隔符,但旁边还有一个空行:
编辑:我创建了一个Github项目,崩溃方式与我的应用程序完全相同.你可以在这里找到它
编辑:因为我调试了这个并尝试了各种更改,我意识到我发布的原始代码并不真正相关,所以我删除了它:
当用户按下自定义布局中插入ActionBar 的3 秒中的一个时,我Activity
可以在3个不同的Fragment
s IconButton
之间切换,例如在各种模式之间切换:
当我第一次启动应用程序(已卸载它)时,我默认为Globe模式.Globe模式中有几个片段ViewPager
,其中大部分片段都是子类android.support.v4.app.ListFragment
.我在主Activity的onCreate方法中创建了所有8个选项卡.这按预期工作,一切正常加载.
当我进入"配置文件"模式(通过单击"脸部"图标按钮)时,我可以登录应用程序,并查看我的个人资料.这也按预期工作,一切正常加载.
当我再次从Android Studio 推送APK时,因为我现在已经登录(保存的首选项),它默认为"朋友提要"模式(两个人手牵着手).我可以将模式切换到配置文件,一切都按预期工作,但是当我切换到Globe模式时,它在Android代码中崩溃:
08-14 14:43:22.744 28804-29323/com.trover E/AndroidRuntime? FATAL EXCEPTION: main
Process: com.trover, PID: 28804
java.lang.NullPointerException
at android.widget.FrameLayout.onMeasure(FrameLayout.java:309)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
at android.view.View.measure(View.java:16497)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:544)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at …
Run Code Online (Sandbox Code Playgroud) 我收到以下警告:
自定义视图com/example/view/adapter/SomeAdapter缺少工具使用的构造函数:(Context)或(Context,AttributeSet)或(Context,AttributeSet,int)
在我的类SomeAdapter中,它扩展了一些扩展ArrayAdapter的BaseAdapter
public class SomeAdapter extends BaseAdapter{}
public abstract class BaseAdapter extends ArrayAdapter<SomeModel>{}
Run Code Online (Sandbox Code Playgroud)
警告存在于具体适配器中,但不存在于抽象BaseAdapter中.在这种情况下有没有人听说过这个警告?
AFAIK Android通过ViewConstructorDetector检查超类的名称来检查类是否正在扩展视图:
private static boolean isViewClass(ClassContext context, ClassNode node) {
String superName = node.superName;
while (superName != null) {
if (superName.equals("android/view/View") //$NON-NLS-1$
|| superName.equals("android/view/ViewGroup") //$NON-NLS-1$
|| superName.startsWith("android/widget/") //$NON-NLS-1$
&& !((superName.endsWith("Adapter") //$NON-NLS-1$
|| superName.endsWith("Controller") //$NON-NLS-1$
|| superName.endsWith("Service") //$NON-NLS-1$
|| superName.endsWith("Provider") //$NON-NLS-1$
|| superName.endsWith("Filter")))) { //$NON-NLS-1$
return true;
}
superName = context.getDriver().getSuperClass(superName);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我的班级名称与上述模式不符.有谁知道如何修复或抑制此警告?
BaseAdapter中的getView():
@Override
public final View getView(final int position, …
Run Code Online (Sandbox Code Playgroud) 谷歌分析版本3的谷歌文档对于EasyTracker
普通Tracker
类和普通类之间的差异非常混乱,我真的不确定我应该使用哪一个.在这个页面上,他们讨论了如何设置EasyTracker
,使用analytics.xml文件来设置您的ID,然后在下一页上他们讨论设置常规跟踪器并将其传递给您的ID:
// Initialize a tracker using a Google Analytics property ID.
GoogleAnalytics.getInstance(this).getTracker("UA-XXXX-Y")
Run Code Online (Sandbox Code Playgroud)
这两个跟踪器有什么区别?一个人有比另一个更多的功能吗?我认为,EasyTracker
如果您只想要活动跟踪,则设置起来会更简单,但如果我想要使用Google Analytics中可用的所有功能,我是否仍然可以使用该功能EasyTracker
,或者我是否需要切换到经常Tracker
?
我是片段新手并且有一个问题:当我更新我的SDK工具并创建一个项目(min = api8,默认值)时,我注意到我的Referenced Library中的android-support-v4.jar.
当我扩展我的类并尝试使用Fragment
该类时,我发现有2个.一个是android.app.Fragment,另一个是android.support.v4.app.Fragment.这两者有什么区别?
我想用gradle使用espresso测试.为此,我尝试使用杰克沃顿的双浓咖啡,但它不起作用.
我已经读过它可能是重复的依赖项,但是我已经排除了Dagger和Support-v4库,就像Jake在他的自述文件中写的那样.
谁能给我一些关于这里可能出错的建议?
package info.korzeniowski.myapp.test;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;
import info.korzeniowski.myapp.R;
import info.korzeniowski.myapp.activity.MainActivity_;
import static com.google.android.apps.common.testing.ui.espresso.Espresso.onView;
import static com.google.android.apps.common.testing.ui.espresso.assertion.ViewAssertions.matches;
import static com.google.android.apps.common.testing.ui.espresso.contrib.DrawerActions.closeDrawer;
import static com.google.android.apps.common.testing.ui.espresso.contrib.DrawerActions.openDrawer;
import static com.google.android.apps.common.testing.ui.espresso.contrib.DrawerMatchers.isClosed;
import static com.google.android.apps.common.testing.ui.espresso.contrib.DrawerMatchers.isOpen;
import static com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.withId;
public class BasicTest extends ActivityInstrumentationTestCase2<MainActivity_> {
public BasicTest() {
super(MainActivity_.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
getActivity();
}
@LargeTest
public void testOpenAndCloseDrawer() {
onView(withId(R.id.drawer_layout)).check(matches(isClosed()));
openDrawer(R.id.drawer_layout);
onView(withId(R.id.drawer_layout)).check(matches(isOpen()));
closeDrawer(R.id.drawer_layout);
onView(withId(R.id.drawer_layout)).check(matches(isClosed()));
}
}
Run Code Online (Sandbox Code Playgroud)
buildscript {
def androidGradlePluginVersion= '0.9.+'
def androidAptVersion = '1.2+' …
Run Code Online (Sandbox Code Playgroud) android android-testing android-gradle-plugin android-espresso
android ×9
adapter ×1
android-tabs ×1
easytracker ×1
html ×1
listadapter ×1
text ×1
warnings ×1