小编Ale*_*niy的帖子

ViewPager和片段 - 什么是存储片段状态的正确方法?

片段似乎非常适合将UI逻辑分离为某些模块.但随着ViewPager它的生命周期对我来说仍然是迷雾.因此迫切需要大师的想法!

编辑

见下面的哑解决方案;-)

范围

主要活动有ViewPager碎片.这些片段可以为其他(子域)活动实现一些不同的逻辑,因此片段的数据通过活动内部的回调接口填充.第一次发布时一切正常,但是!...

问题

当重新创建活动时(例如,在方向改变时),那么ViewPager碎片也是如此.代码(你会在下面找到)说每次创建活动时我尝试创建一个ViewPager与片段相同的新片段适配器(也许这就是问题)但FragmentManager已经将所有这些片段存储在某个地方(其中?)和为那些人启动娱乐机制.因此,重新启动机制使用我的回调接口调用来调用"旧"片段的onAttach,onCreateView等,以通过Activity的实现方法启动数据.但是这个方法指向通过Activity的onCreate方法创建的新创建的片段.

问题

也许我使用了错误的模式,但即便是Android 3 Pro也没有太多关于它的内容.所以,给我一两拳,并指出如何以正确的方式做到这一点.非常感谢!

主要活动

public class DashboardActivity extends BasePagerActivity implements OnMessageListActionListener {

private MessagesFragment mMessagesFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    Logger.d("Dash onCreate");
    super.onCreate(savedInstanceState);

    setContentView(R.layout.viewpager_container);
    new DefaultToolbar(this);

    // create fragments to use
    mMessagesFragment = new MessagesFragment();
    mStreamsFragment = new StreamsFragment();

    // set titles and fragments for view pager
    Map<String, Fragment> screens = new LinkedHashMap<String, Fragment>();
    screens.put(getApplicationContext().getString(R.string.dashboard_title_dumb), new DumbFragment());
    screens.put(getApplicationContext().getString(R.string.dashboard_title_messages), mMessagesFragment);

    // …
Run Code Online (Sandbox Code Playgroud)

android design-patterns android-fragments android-viewpager

483
推荐指数
5
解决办法
22万
查看次数

ViewPager拦截所有x轴onTouch事件.如何禁用?

范围

有两个片段的viewpager.其中一个片段有一个布局,可以在X轴上监听onTouch的变化.

问题

当沿X轴触摸和滑动时,布局几乎不会获得所有Action.Move事件.似乎viewpager有一个返回true的onInterceptTouchEvent.

覆盖viewpager的行为以使它和我的布局协同工作是真的吗?因此,完美的情况是布局拦截其上的所有onTouch事件,viewpager管理其余的onTouch事件.谢谢!

android ontouchlistener android-viewpager

33
推荐指数
2
解决办法
3万
查看次数

等待unitl ListView的smoothScrollToPosition()完​​成

范围

我需要顺利滚动到某个位置,然后"跳"到另一个位置setSelection(anotherPosition).这样做是为了创造一个平滑滚动(例如)100个项目的幻觉ListView.smoothScrollToPosition(100)你知道,持续太久了.

问题

setSelection()不等到smoothScrollToPosition完成它的工作,因此setSelection()被立即调用,用户只能看到快速跳跃;

private final int scrollableItems = 20;

int firstVisiblePosition = mListView.getFirstVisiblePosition();
if (firstVisiblePosition < scrollableItems) {
    mListView.smoothScrollToPosition(0);
} else {
    mListView.smoothScrollToPosition(firstVisiblePosition - scrollableItems);
    mListView.setSelection(0);
}
mListView.clearFocus();
Run Code Online (Sandbox Code Playgroud)

理念

好的,我们可以改变平滑幻觉的逻辑:首先setSelection(),然后顺利滚动(我们滚动到列表顶部的第一个项目):

    int firstVisiblePosition = mListView.getFirstVisiblePosition();

    if (firstVisiblePosition < scrollableItems) {
        mListView.smoothScrollToPosition(0);
    } else {
        mListView.setSelection(scrollableItems);
        mListView.smoothScrollToPosition(0);
    }
    mListView.clearFocus();
Run Code Online (Sandbox Code Playgroud)

android listview smooth-scrolling

15
推荐指数
1
解决办法
2万
查看次数

Android AccountManager authToken和OAuth

我的任务是为Gmail编写IMAP电子邮件客户端.到目前为止,我知道客户端应该通过OAuth 进行身份验证(Google 还有一个用于IMAP身份验证java库).但我想让用户免于任何密码输入.

Android提供了一种很酷的"原生"方式,通过AccountManager获取Google帐户服务的authToken.但我想知道如何使用authToken以及它的用途是什么?它仅适用于GAE身份验证吗?

有没有办法在没有浏览器的情况下获取oauthToken和oauthTokenSecret(通过AccountManager)?

android oauth accountmanager

6
推荐指数
1
解决办法
6163
查看次数

广播接收器对内存的成本是多少?

范围:必须以不同方式更新活动UI.更新取决于从服务收到的广播. 问题:有两种常见的方法可以找出应该更新UI的方式:

  1. 只注册1个广播接收器,但在其意图中加入不同的附加内容并在活动中的OnReceive()方法中检查它们;
  2. 为每个更新命令注册广播.

第二种方式似乎更优雅,更容易理解.但我想知道它是否会消耗更多内存.你会推荐什么?谢谢!

memory android broadcastreceiver

6
推荐指数
1
解决办法
892
查看次数

使用selector和isEnabled()禁用listview项

范围: - 使用overriden ArrayAdapter; - 使用选择器; - 使用isEnabled禁用项目.

目标: - 禁用某些列表项并通过选择器加载禁用状态视图.

问题: - 一切正常(自定义视图,选择器用于未聚焦,focuesd和按下状态)但禁用的项目不使用选择器用于禁用状态.

调查:当我使用isEnabled禁用listview中的某些项时,层次结构查看器显示禁用的项目不可聚焦,不可点击但启用(!).

这是一个错误或缺少什么?

PS实际上,docs说isEnabled没有为列表项做setEnabled(false),它使它成为一个divider(?)对象.PPS我也尝试使用if语句将我的View(在getView中)设置为isEnabled(false).但它只适用于重点项目?

我的选择器看起来像:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Disabled -->
    <item 
        android:state_enabled="false"
        android:textColor="@color/greyDark"
        android:drawable="@drawable/list_item_disabled" />
    <!-- Pressed -->
    <item 
        android:state_enabled="true"
        android:state_pressed="true"
        android:textColor="@android:color/white"
        android:drawable="@drawable/list_item_pressed" />
    <!-- Focused -->
    <item
        android:state_enabled="true"
        android:state_focused="true"
        android:textColor="@android:color/white"
        android:drawable="@drawable/list_item_focused" />
    <!-- Default -->
    <item 
        android:state_enabled="true"
        android:drawable="@drawable/list_item_unfocused" />
</selector>
Run Code Online (Sandbox Code Playgroud)

xml android listview android-arrayadapter

4
推荐指数
1
解决办法
7354
查看次数

ViewPager和片段 - 设计嵌套片段或..?

文档说你不应该嵌套片段因为它们被设计成以另一种方式工作.但!

范围

但是,如果我使用ViewPager并且它的片段(可见屏幕)应该由其他片段构建.假设我们有一个Messenger应用程序.在主屏幕上有一个ViewPager,片段名为"Last messages"(MessagesFragment),在子域屏幕上(比如讨论或聊天室)我们也有一个ViewPager但是Messages屏幕包含MessagesFragment,NewMessageBarFragment和例如带有其他信息的标题片段.

问题

可以说我们不应该使用ViewPager,我们可以使用ViewFlow开源库,但是相信我的代码,即使是片段,这些活动中的代码也是混乱的.还有一种方法可以填充额外的布局,而不是MessagesFragment中的NewMessageBar和HeaderInfo的片段 - 但对我来说这是双重丑陋.

在这种特殊情况下使用嵌套片段是否可以?你会推荐什么?

Upadate

有时它真的是"必须拥有"的功能.但!在大多数情况下,我建议遵循"响应式设计"的方式:http://www.slideshare.net/kirillcool/responsive-mobile-design-in-practice

android android-fragments android-viewpager

1
推荐指数
1
解决办法
4905
查看次数