小编bro*_*oli的帖子

如何更新ActionBar中显示的菜单项?

我有一个活动,有2个片段.两者都是ListFragments,并且都将MenuItems贡献给菜单.我有一个MenuItem我设置了属性android:showAsAction让它显示为ActionBar上的一个按钮.哪个工作正常.

现在MenuItem依赖于状态.它是暂停/恢复菜单选项,用于暂停和恢复队列.我的问题是,当创建片段时,我无法弄清楚如何设置它的初始雕像.

它的状态取决于队列是否暂停.所以我有一个AsyncTask来获取队列并根据队列的状态设置一个布尔值(暂停).我正在调用PrepareOptionsMenu来根据队列的最后已知状态设置Pause菜单项的文本,如果我将MenuItem保留在实际菜单中,这将很有用.您点击菜单图标并触发onPrepareOptionsMenu,菜单会在显示之前更新.

问题是,如果我在ActionBar(showAsAction)上放置相同的MenuItem,如何强制它更新而不必调用onPrepareOptionsMenu?我需要能够这样做,因为在第一次启动应用程序时,我发送了一个获取队列的请求,但是在设置并显示ActionBar后,任务返回.我在我的片段中创建了一个处理程序,每次我获得队列更新时都会调用它,但是从那里,如何在ActionBar上更新我的MenuItem的文本?我似乎无法找到一种方法来获取当前设置的Menu来操作它,除了onPrepareOptionMenu.

罗布

android menu android-fragments android-actionbar

91
推荐指数
3
解决办法
10万
查看次数

布局动画在首次运行时无效

我有一个包含项目列表的活动,当您点击某个项目时,我希望该项目的播放控件从屏幕底部向上滑动并变为可见.我为幻灯片定义了一个动画集并且滑出了它们并且它们起作用.我在我的活动中设置了我的animationListener,并在动画上点击了一个项目.我的问题是,第一次运行应用程序时,当我单击某个项目时,会执行onClick回调,但动画不会发生.我第二次点击,动画中的幻灯片发生了,但没有滑出.第三次及以后,它按预期工作.这是我的动画集.

vm_slide_in.xml

    <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" 
           android:fillAfter="true">
    <translate
        android:fromYDelta="800"
        android:toYDelta="0"
        android:duration="600" />
</set>
Run Code Online (Sandbox Code Playgroud)

vm_slide_out.xml

    <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" 
           android:fillAfter="true">
    <translate
        android:fromYDelta="0"
        android:toYDelta="800"
        android:duration="600" />
</set>
Run Code Online (Sandbox Code Playgroud)

这是我的活动布局

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/AppBG">
    <RelativeLayout 
        style="@style/LogoBar" 
        android:id="@+id/logo_bar"      
        android:layout_alignParentTop="true">
        <include layout="@layout/logobar"></include>
    </RelativeLayout>
    <RelativeLayout 
        style="@style/TitleBar" 
        android:id="@+id/title_bar"     
        android:layout_below="@+id/logo_bar">
        <include layout="@layout/titlebar"></include>"
        <Button style="@style/TitleBarButton"
            android:id="@+id/vm_speaker_btn"
            android:text="@string/vm_speaker_btn_label" 
            android:layout_alignParentLeft="true"
            android:layout_margin="4dp">
        </Button>
        <Button style="@style/TitleBarButton"
            android:id="@+id/vm_edit_btn"
            android:text="@string/vm_edit_btn_label" 
            android:layout_alignParentRight="true"
            android:layout_margin="4dp">
        </Button>
    </RelativeLayout>
    <ListView
        android:id="@+id/@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/title_bar"/>
    <RelativeLayout
        android:id="@+id/vm_control_panel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/footer"
        android:visibility="gone">
        <include layout="@layout/vm_control"/>
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/footer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

android android-animation

44
推荐指数
3
解决办法
4万
查看次数

Android:使用ObjectAnimator将View转换为View维度的小数值

似乎旧的视图动画(translate,scale等等)不再被AnimationInflaterICS 接受了.我在阅读4.0.4的代码,并明确预计只有XML元素set,objectAnimator,animator.

即使http://developer.android.com/guide/topics/resources/animation-resource.html上的文档继续包含视图动画,它们似乎也已弃用.例如,尝试使用它们会导致错误java.lang.RuntimeException: Unknown animator name: translate.

因此,有必要使用Android ObjectAnimator.但是,它不接受自身或其父级(translationX例如,宽度)的关联维度的小数值,就像旧视图动画在表单中所做的那样"75%p".

ObjectAnimator通过以编程方式获取片段的大小来在运行时手动构建是不可行的,因为它FragmentTransaction仅接受由渣油指定的声明性动画.

我的目标是在屏幕外翻译一个填满整个Activity的Fragment(我基本上是在两个片段之间进行转换).这是现有的TranslationAnimation实现(由于某些原因slide_in_right.xml,它与其对应物slide_out_left.xml没有公开android.R.anim,因此我必须在我的代码库中复制它们):

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta="100%p"
    android:toXDelta="0"
    android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)

我的API级别设置为14.

谢谢!

animation android

40
推荐指数
3
解决办法
7万
查看次数

在ListFragment中添加Header的最佳位置

我在列表中设置自定义标题时遇到了一些麻烦.

我正在使用自定义适配器创建ListFragment.我的列表工作正常,但我正在试图找出片段的生命周期中附加标题的位置.

我知道在设置适配器之前必须添加标头.

我尝试在onActivityCreated中添加我的标题,但是每次我的Fragment从backstack返回时都会调用它,并且因为我还在onActivityCreated中设置了我的适配器,所以它失败了.

我尝试在onCreate中添加它,但视图层次结构在生命周期的那个阶段不可用.

我尝试在onCreateView中添加它,但我无法将从inflate返回的视图转换为ListView.所以我无法将标题添加到香草视图中.

有什么想法吗?

android listview header adapter android-fragments

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

如何处理webview确认对话框?

我在WebView中显示一个网页,在网页上有一个按钮.当您单击该按钮时,应该弹出一个确认对话框,但它不会显示在我的WebView中.如果我在Android浏览器中访问同一个网页,它会弹出.任何人都知道如何处理来自WebView内部网页的弹出对话框?

android dialog popup handle webview

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

Android SAX解析器无法从标记之间获取完整文本

我已经创建了自己的DefaultHandler来解析rss提要,并且对于大多数提要它工作正常,但是,对于ESPN,由于ESPN格式化网址的方式,它正在切断部分文章网址.来自ESPN的完整文章网址的一个例子..

http://sports.espn.go.com/nba/news/story?id=5189101&amp;campaign=rss&amp;source=ESPNHeadlines
Run Code Online (Sandbox Code Playgroud)

问题是由于某种原因,DefaultHandler字符方法只从包含上述url的标记中获取.

http://sports.espn.go.com/nba/news/story?id=5189101
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它正在从&符号转义码和之后的网址中删除所有内容.如何让SAX解析器不在此转义码中删除我的字符串?对于参考 这是我的角色方法..

 public void characters(char ch[], int start, int length) {

  String chars = (new String(ch).substring(start, start + length));

  try {
   // If not in item, then title/link refers to feed
   if (!inItem) {
    if (inTitle)
     currentFeed.title = chars;
   } else {
    if (inLink)
     currentArticle.url = new URL(chars);
    if (inTitle)
     currentArticle.title = chars;
    if (inDescription)
     currentArticle.description = chars;
    if (inPubDate)
     currentArticle.pubDate = chars;
    if (inEnclosure) {
    }
   }
  } catch (MalformedURLException e) {
   Log.e("RSSReader", e.toString());
  } …
Run Code Online (Sandbox Code Playgroud)

parsing android sax escaping

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

在片段之间动画的共享元素

我正在尝试将RecyclerView中所选项目的2个简单视图设置为新片段.我已经查看了很多将共享元素从一个Activity动画到另一个Activity的示例,但很少有动画将共享元素从一个Fragment动画到同一个Activity中的另一个Fragment的示例.它几乎可以工作.

这是我的结构.

活动

- 使用RecyclerView的全屏Fragment1

- 带有详细信息的全屏Fragment2

当用户在Fragment1中的RecyclerView中选择一个项目时,我将Fragment1替换为具有View的Fragment2,其中包含不同位置和大小的共享元素.

要使它工作有一些技巧,你必须确保你的transitionName对于列表中的每个项都是唯一的,当然,transitionName必须与Fragment2中元素的transitionName匹配才能播放动画.我有这个部分工作,当我选择一个项目时,2个共享视图会动画,而不是在2个活动之间进行动画时的预期.

如果我在屏幕底部附近选择一个项目,它会绘制View for Fragment2并为2个共享视图设置动画,就好像它们位于屏幕顶部的项目中一样.难以解释.这是一些照片

片段1 选择列表底部附近的项目

Fragment2 我希望蓝线从底部到顶部动画,但它从顶部开始并且只在水平方向上增长,黄色线我希望保持在底部附近但水平增长,但它从屏幕顶部开始并动画下来

在这两个片段中我都设置了以下内容

        setSharedElementEnterTransition(new ChangeBounds());
        setSharedElementReturnTransition(new ChangeBounds());
        setAllowEnterTransitionOverlap(true);
        setAllowReturnTransitionOverlap(true);
Run Code Online (Sandbox Code Playgroud)

同样在他们的onCreate()中的父Activity中我已经设置了

        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
Run Code Online (Sandbox Code Playgroud)

知道为什么我的共享元素动画从我的屏幕顶部开始,即使它们是在屏幕底部的选定项目中开始的吗?

android android-fragments shared-element-transition fragment-transitions android-recyclerview

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

Fragment中的FragmentPagerAdapter

我在实现基于多个ViewPagers的设计时遇到了一些麻烦.

在高级别,我有一个FragmentActivity只有一个FrameLayout作为它的内容.我想要显示3个不同的碎片.全部3个全屏,一次只使用1个.

片段1是一个带有一些TextView和ImageViews的基本片段.片段2有一个ViewPager和一个FragmentPagerAdapter,可以为它提供几个简单的片段.片段3有一个ViewPager和一个FragmentPagerAdapter,可以为它提供几个简单的片段(与片段2不同)

在我的FragmentActivity onCreate()中,我获得了FragmentManager并开始一个事务,用一个新的Fragment 2实例替换我的FrameLayout中的任何东西.

在这一点上,一切都按预期工作.Fragment 2中的我的ViewPager工作得很好.

现在我有一个菜单选项,用我的FrameLayout中的Fragment 2替换Fragment 3的新实例.这也可以正常工作.

当我尝试使用另一个替换事务将Fragment 2放回FrameLayout时出现问题.我看到我的PagerIndicater位于顶部,但我的页面是空白的.

我试过创建一个我的Fragment 2的新实例并调用一个替换事务.当我调用replace并在替换之前添加findFragmentByTag检查而不是创建新实例时,我也尝试在我的Fragments上设置标记.在第二次更换后,两者都给了我相同的空白页结果.

供参考我的第一个设计只是一个带有ViewPager和ViewIndicater的FragmentActivity.我上面的描述中只有Fragment 2和Fragment 3以及在它们之间切换的菜单选项.要切换我有2个不同的FragmentPagerAdapters定义,只需调用ViewPager.setAdapter来设置选定的FragmentPagerAdapter.这是完美的,但现在我需要一个新的顶级片段,根本不使用ViewPager.这就是我决定将ViewPagers移到他们自己的片段中的原因.我的想法是,我只是将我的片段交换到FrameLayout.

我现在没有我的代码在我面前所以我不能发布任何代码,但我明天会在我的问题中添加一些代码来帮助提供答案.

android android-fragments android-viewpager fragmentpageradapter android-nested-fragment

9
推荐指数
2
解决办法
6863
查看次数

AppWidgetHost不更新小部件

我可以AppWidgetHost在里面使用Fragment吗?我无法将大多数小部件添加到我的AppWidgetHost中进行更新.这是我的情景..

LauncherActivity.java

  • 非常简单,只需使用布局调用setContentView.

main.xml中

  • 包含一些片段,包括其中包含AppWidgetHost的片段.

CodeRedWidgetHostFragment.java

  • onCreateView
    创建AppWidgetHost和AppWidgetManager的实例
    创建并设置我的主机视图,其中包含我存储在首选项中的小部件ID

  • onStart()
    appWidgetHost.startListening()

  • onStop()
    appWidgetHost.stopListening()

当我得到AppWidgetHost和AppWidgetManager的实例时,我正在使用getActivity()来获取Fragments托管活动.我想知道这是不是我的小部件没有更新的原因?

有些小部件实际上会更新,例如模拟时钟,但是,Youtube小部件不会自动循环显示视频缩略图.

我应该提一下,我在AppWidgetHost中选择了我想要的小部件,在另一个活动中将所选小部件的id存储在SharedPreferences中.

这是我的Fragment类的代码.

package com.brockoli.android.codered.widgethost;

import android.app.Fragment;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.brockoli.android.codered.R;

public class CodeRedWidgetHostFragment extends Fragment {
private static final String TAG = CodeRedWidgetHostFragment.class.getSimpleName();

public static final String CODERED_WIDGET_ID = "CODERED_WIDGET_ID";

private SharedPreferences mSharedPrefsWidgets;

AppWidgetManager mAppWidgetManager;
AppWidgetHost mAppWidgetHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup …
Run Code Online (Sandbox Code Playgroud)

android host android-widget android-fragments android-appwidget

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

Android AlertDialog没有显示单选按钮或消息

在我的应用程序中,我在ListActivity中长按一下上下文菜单.其中一个选项"Priority"会弹出一个AlertDialog,其中包含3个单选按钮选项.问题是,它显示一个没有我选择的空对话框,或者我设置的消息.这是我的代码..

protected Dialog onCreateDialog(int id) {
    AlertDialog dialog;
    switch(id) {
    case DIALOG_SAB_PRIORITY_ID:
        final CharSequence[] items = {"High", "Normal", "Low"};

        AlertDialog.Builder builder = new AlertDialog.Builder(SabMgmt.this);
        builder.setMessage("Select new priority")
               .setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
            }
        });

        dialog = builder.create();            
        break;
    default:
        dialog = null;
    }
    return dialog;
}
Run Code Online (Sandbox Code Playgroud)

如果我用正面和负面按钮替换.setSingleChoiceItems,它会按预期显示按钮和消息.我在设置单选按钮列表时做错了什么?这是我的调用代码..

public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {
    case R.id.sabdelete:
        // Correct position (-1) for 1 header
        final …
Run Code Online (Sandbox Code Playgroud)

android radio-button android-alertdialog

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

ListView适配器数据更改而不通知ListView

我写了一个ListActivity,它有一个自定义列表适配器.运行onCreate时,将从ContentProvider更新列表.我还有一个服务,在我运行应用程序时启动,它首先更新ContentProvider,然后发送内容已更新的广播.
我的ListActivity接收广播并尝试更新我的ListView.我的问题是,我收到有关ListView适配器数据更改的间歇性错误,而不通知ListView.我notifyDataSetChanged()更新后立即调用我的列表适配器上的方法.看起来似乎正在发生的事情是,当它接收来自服务的广播以进行更新时,列表仍然在第一次调用onCreate之后进行更新,因此它尝试更新我的ListView,直到它从第一次运行完成更新.这有意义吗?这是我的一些代码.

注意:该服务正常运行,它获取新数据并更新我的ContentProvider,并且在更新时我确实在我的活动中获得了广播.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ctx = this;
    getPrefs();
    setContentView(R.layout.main);

    // Setup preference listener
    preferences = PreferenceManager.getDefaultSharedPreferences(this);
    preferences.registerOnSharedPreferenceChangeListener(listener);


    // Setup report list adapter
    ListView nzbLv = (ListView) findViewById(R.id.report_list);
    nzbla = new NZBReportListAdaptor(ctx);
    getReports();
    nzbla.setListItems(report_list);            
    nzbLv.setAdapter(nzbla);        
    // Broadcast receiver to get notification from NZBService to update ReportList
    registerReceiver(receiver,
            new IntentFilter(NZBService.BROADCAST_ACTION));

    startService(new Intent(ctx, NZBService.class));
}

@Override
public void onResume() {
    super.onResume();
    timerHandler.resume();      
new updateSabQueue().execute();
    //updateList();
}

@Override
public void onPause() {
    super.onPause();
    timerHandler.pause();
    unregisterReceiver(receiver);
} …
Run Code Online (Sandbox Code Playgroud)

android adapter notify android-listview

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

如果活动崩溃,如何清除通知?

在我的应用程序中,我正在创建一个FLAG_ONGOING_EVENT标志设置的通知.

Notification notification = new Notification(iconId, text, System.currentTimeMillis());  
notification.flags |= Notification.FLAG_ONGOING_EVENT;
Run Code Online (Sandbox Code Playgroud)

我正在取消onDestroy中的通知,但如果我的应用程序在调用onDestroy之前崩溃,有没有办法让我的通知消失?

罗布

crash notifications android android-activity

5
推荐指数
2
解决办法
3916
查看次数