我知道它Activities
的目的是代表我的应用程序的单个屏幕,同时Fragments
设计为可重用的UI布局,其中嵌入了逻辑.
直到不久前,我开发了一个应用程序,因为它说应该开发它们.我创建了一个Activity
代表我的应用程序的屏幕并使用Fragments for ViewPager
或Google Maps
.我很少创建ListFragment
可以多次重用的UI或其他UI.
最近我偶然发现一个项目只包含2 Activities
个是一个SettingsActivity
而另一个是MainActivity
.它的布局中MainActivity
填充了许多隐藏的全屏UI片段,只显示了一个.在Activity
逻辑FragmentTransitions
中,应用程序的不同屏幕之间存在许多.
我喜欢这种方法的原因是因为应用程序使用了一个ActionBar
,它保持原样并且不会随着屏幕切换动画一起移动,这就是Activity
切换时发生的情况.这为这些屏幕转换提供了更流畅的感觉.
所以我想我要问的是分享你关于这个主题的当前开发方式,我知道它看起来可能看起来像一个基于意见的问题,但我把它视为一个Android设计和架构问题...不是真的基于意见的一个.
更新(01.05.2014):继来自Square的Eric Burke的演示之后(我不得不说这是一个很棒的演示文稿,为Android开发人员提供了许多有用的工具.而且我与Square没有任何关系)
http://www.infoq.com/presentations/Android-Design/
根据我过去几个月的个人经验,我发现构建应用程序的最佳方法是创建一组片段,这些片段代表应用程序中的流并将所有这些片段集中在一个片段中Activity
.所以基本上你Activities
的应用程序的数量与流量的数量相同.这样,操作栏在所有流程的屏幕上保持完整,但正在重新创建流程,这很有意义.正如埃里克伯克所说,并且我也已经意识到,尽可能少Activities
地使用的哲学并不适用于所有情况,因为它在他所谓的"上帝"活动中造成混乱.
到现在为止,当我想阻止用户按下按钮时,我会设置
button.setClickable(false);
并通常将文本更改为某种灰色(让用户知道按钮被禁用).今天我偶然发现了这家setEnabled()
酒店.
所以我去了文档,看看方法的解释如下:
setEnabled(boolean enabled)
Set the enabled state of this view.
Run Code Online (Sandbox Code Playgroud)
这甚至意味着什么?启用状态/可点击状态和禁用状态/不可点击状态之间有什么区别?有人可以解释一下我以前做过什么,使用可点击的属性和使用setEnabled()
属性之间的区别是什么?什么时候应该用?我搜索了StackOverflow但找不到任何相关内容.提前致谢.
这是我在IOS应用程序开发中的第一步,我遇到了一些我无法弄清楚的问题.
error: Embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target's code sign settings match the parent app's.
Embedded Binary Signing Certificate: Not Code Signed
Parent App Signing Certificate: iPhone Developer: Emil Adz (9QNEF95395)
Run Code Online (Sandbox Code Playgroud)
我无法理解,什么是嵌入式二进制签名证书?
我在这里回答了同样的错误,但没有一个与这里提出的问题有关(Not Code Signed).
我试图从Apple开发者会员中心撤销我的证书并申请另一个证书,但问题仍然存在.
有人知道如何解决这个问题吗?
我想允许用户ViewPager
仅从右向左滑动.因此,一旦他通过一个页面,他就无法回到它.如何才能做到这一点?
我试过这个解决方案:
public class CustomViewPager extends ViewPager {
float lastX = 0;
boolean lockScroll = false;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomViewPager(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = ev.getX();
lockScroll = false;
return super.onTouchEvent(ev);
case MotionEvent.ACTION_MOVE:
if (lastX > ev.getX()) {
lockScroll = false;
} else {
lockScroll = true;
}
lastX = ev.getX();
break;
}
lastX = ev.getX();
if(lockScroll) …
Run Code Online (Sandbox Code Playgroud) 我正在使用该Showcase
库向用户解释我的应用程序功能.在某些方面,我需要调暗整体ActionBar
以向用户呈现另一个功能.
为此,我正在使用setAlpha(float num)
该View
课程.因此,为了做到这一点,我需要得到我的实际视图实例ActionBar
顺便说一句,我正在使用support-7-appcompat
为旧系统提供ActionBar支持的库.
在此期间,如果您配置自定义视图并ActionBar
使用以下命令将其添加到您,我找到了此选项:
getSupportActionBar().setCustomView(v);
Run Code Online (Sandbox Code Playgroud)
然后得到View
的ActionBar
,你可以这样做:
(View) activity.getSupportActionBar().getCustomView().getParent().getParent()
Run Code Online (Sandbox Code Playgroud)
有更简单或更简单的方法吗?
android view android-actionbar showcaseview android-actionbar-compat
我正在试用Google的新Volley库,当我使用这种方法时,它看起来很清晰,可以快速加载图像setImageUrl
:
holder.image.setImageUrl(url, ImageCacheManager.getInstance().getImageLoader());
Run Code Online (Sandbox Code Playgroud)
我想在其中添加一个回调/侦听器方法,该方法将在加载完成后启动,因此我可以删除progressBar
视图并显示图像.这是Universal Image Loader和Picasso库中存在的一个选项,但出于某种原因,我找不到在Volley中这样做的方法,尝试了Google的不同选项,但到目前为止还没有找到任何参考.
有人有代码示例来说明它是如何完成的吗?
我正在使用新的gradle构建系统,我遇到了以下问题:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/kibo/mobi/BuildConfig;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
at com.android.dx.command.dexer.Main.run(Main.java:230)
at com.android.dx.command.dexer.Main.main(Main.java:199)
at com.android.dx.command.Main.main(Main.java:103)
Run Code Online (Sandbox Code Playgroud)
打印依赖项我什么都看不到,这里是:
firstDebugCompile - ## Internal use, do not manually configure ##
\--- KiboGradle:KiboSDK:unspecified
+--- KiboGradle:TextInputAPI:unspecified
+--- KiboGradle:VoiceImeUtils:unspecified
+--- com.google.android.gms:play-services:5.0.77
| \--- com.android.support:support-v4:19.1.0
+--- com.squareup.picasso:picasso:2.3.2
+--- com.google.code.gson:gson:2.2.4
\--- com.crittercism:crittercism-android-agent:4.5.1
Run Code Online (Sandbox Code Playgroud)
我试图验证问题不是重复的支持库,所以我尝试添加:
compile ('com.google.android.gms:play-services:5.0.77'){
exclude module: 'support-v4'
}
Run Code Online (Sandbox Code Playgroud)
这导致一些support-v4
库类无法找到的错误,因此这个库不能从任何其他位置编译.
有一件事我脑子里想的,可能会导致这个问题是我使用的事实Flavors
feautre在oreder创建我有不同的国土资源文件的应用程序的多个版本.
当我查看错误中的文件时,我看到了:
**
* Automatically generated file. DO NOT MODIFY …
Run Code Online (Sandbox Code Playgroud) 我创建了几个片段,并按以下方式添加第一个片段:
mainFragment = (MainFragment) MainFragment.create();
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
.add(R.id.content, mainFragment, MAIN_FRAGMENT_TAG)
.commit();
Run Code Online (Sandbox Code Playgroud)
第二个片段以这种方式添加:
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
//.hide(mainFragment)
.add(R.id.content,VenueFragment.create(vid), "Venue Fragment")
.addToBackStack(null)
.commit();
setDrawerIndicatorEnabled(false);
Run Code Online (Sandbox Code Playgroud)
现在你看到hide方法没有应用于这个事务,并且VenueFragment
打开了,在这种情况下的问题是,当VenueFragment
按下这个片段的空部分时打开(并且它是一个全屏视图)调用MainFragment
可点击视图的调用.我怎么能阻止这个?
如果我使用隐藏选项,那么它不会发生,但由于某种原因,删除它的动画MainFragment
正在上升,这会产生一种奇怪的体验.
android android-fragments fragmenttransaction fragmentmanager
我对表格布局滚动感到困惑.我必须实现水平和垂直滚动表.我也看到了表修复标题示例,但tablefixheader示例使用了适配器来设置数据,但我需要在表格布局中添加视图方法.我使用下面的代码,但它不支持两种方式滚动
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical" >
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:fadeScrollbars="false">
<TableLayout
android:id="@+id/tableLayoutId"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</HorizontalScrollView>
</ScrollView>
Run Code Online (Sandbox Code Playgroud) 我遇到了一些实现的类代码,Clonable
文档说明:
类实现了Cloneable接口,以向Object.clone()方法指示该方法合法地为该类的实例制作字段的字段副本.在未实现Cloneable接口的实例上调用Object的clone方法会导致抛出异常CloneNotSupportedException.按照惯例,实现此接口的类应使用公共方法覆盖Object.clone(受保护).有关重写此方法的详细信息,请参阅Object.clone().请注意,此接口不包含克隆方法.因此,仅仅通过实现该接口的事实来克隆对象是不可能的.即使反射调用clone方法,也无法保证它会成功.
我无法理解实现这个类的重点,正如文档中所述,该.clone
方法没有在接口中实现,我必须实现它.那么为什么要使用这门课?为什么我不在copyClass
我的类中编写一个方法来制作对象副本而不执行这个类?
提前致谢.