我有一个活动,有2个片段.两者都是ListFragments,并且都将MenuItems贡献给菜单.我有一个MenuItem我设置了属性android:showAsAction让它显示为ActionBar上的一个按钮.哪个工作正常.
现在MenuItem依赖于状态.它是暂停/恢复菜单选项,用于暂停和恢复队列.我的问题是,当创建片段时,我无法弄清楚如何设置它的初始雕像.
它的状态取决于队列是否暂停.所以我有一个AsyncTask来获取队列并根据队列的状态设置一个布尔值(暂停).我正在调用PrepareOptionsMenu来根据队列的最后已知状态设置Pause菜单项的文本,如果我将MenuItem保留在实际菜单中,这将很有用.您点击菜单图标并触发onPrepareOptionsMenu,菜单会在显示之前更新.
问题是,如果我在ActionBar(showAsAction)上放置相同的MenuItem,如何强制它更新而不必调用onPrepareOptionsMenu?我需要能够这样做,因为在第一次启动应用程序时,我发送了一个获取队列的请求,但是在设置并显示ActionBar后,任务返回.我在我的片段中创建了一个处理程序,每次我获得队列更新时都会调用它,但是从那里,如何在ActionBar上更新我的MenuItem的文本?我似乎无法找到一种方法来获取当前设置的Menu来操作它,除了onPrepareOptionMenu.
罗布
我有一个包含项目列表的活动,当您点击某个项目时,我希望该项目的播放控件从屏幕底部向上滑动并变为可见.我为幻灯片定义了一个动画集并且滑出了它们并且它们起作用.我在我的活动中设置了我的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) 似乎旧的视图动画(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.
谢谢!
我在列表中设置自定义标题时遇到了一些麻烦.
我正在使用自定义适配器创建ListFragment.我的列表工作正常,但我正在试图找出片段的生命周期中附加标题的位置.
我知道在设置适配器之前必须添加标头.
我尝试在onActivityCreated中添加我的标题,但是每次我的Fragment从backstack返回时都会调用它,并且因为我还在onActivityCreated中设置了我的适配器,所以它失败了.
我尝试在onCreate中添加它,但视图层次结构在生命周期的那个阶段不可用.
我尝试在onCreateView中添加它,但我无法将从inflate返回的视图转换为ListView.所以我无法将标题添加到香草视图中.
有什么想法吗?
我在WebView中显示一个网页,在网页上有一个按钮.当您单击该按钮时,应该弹出一个确认对话框,但它不会显示在我的WebView中.如果我在Android浏览器中访问同一个网页,它会弹出.任何人都知道如何处理来自WebView内部网页的弹出对话框?
我已经创建了自己的DefaultHandler来解析rss提要,并且对于大多数提要它工作正常,但是,对于ESPN,由于ESPN格式化网址的方式,它正在切断部分文章网址.来自ESPN的完整文章网址的一个例子..
http://sports.espn.go.com/nba/news/story?id=5189101&campaign=rss&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) 我正在尝试将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
我在实现基于多个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
我可以AppWidgetHost在里面使用Fragment吗?我无法将大多数小部件添加到我的AppWidgetHost中进行更新.这是我的情景..
LauncherActivity.java
main.xml中
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
在我的应用程序中,我在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) 我写了一个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) 在我的应用程序中,我正在创建一个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之前崩溃,有没有办法让我的通知消失?
罗布