我有一个片段界面,底部有标签,可以在主视图中打开不同的片段.
我有一个特定的片段,它是一个项目列表.如果用户选择此列表中的一个项目,则打开另一个片段,其中包含一个viewpager,它在前一个片段的列表中的所有项目之间水平滚动.这非常有效.
viewpager使用FragmentPagerAdapter来显示项目.
当用户选择列表中的项目,查看它,然后点击标签栏上的按钮返回列表,然后选择另一个项目时,问题就出现了.第二次选择项目时,将显示空白屏幕而不是viewpager.发生这种情况时,我的LogCat中没有收到任何错误.
为什么viewpager只出现在第一次?
FragmentPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter {
Cursor mCursor;
public ViewPagerAdapter(FragmentManager fm, Cursor c) {
super(fm);
mCursor = c;
}
public void changeCursor(Cursor c) {
mCursor = c;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
if (mCursor == null) return 0;
else return mCursor.getCount();
}
@Override
public Fragment getItem(int position) {
mCursor.moveToPosition(position);
return TeamCardFragment.newInstance(mCursor, position);
}
}
Run Code Online (Sandbox Code Playgroud)
PagerFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle bundle = getArguments();
mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION); …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager android-nested-fragment
更新:我还没有找到问题的真正解决方案.我所做的是一种在连接丢失时自动重新连接到以前的蓝牙设备的方法.它并不理想,但似乎运作得相当好.我很想听到有关这个的更多建议.
我遇到的问题与此问题大致相同:服务在被唤醒时被杀死并且在调用startForeground之后包括设备(Asus Transformer),服务停止前的时间长度(30-45分钟),使用唤醒锁定,使用startForeground(),以及当屏幕关闭时应用程序打开时不会发生问题的事实.
我的应用程序维护与另一台设备的蓝牙连接,并在两者之间发送数据,因此它必须始终处于活动状态以侦听数据.用户可以随意启动和停止服务,实际上这是我实现启动或停止服务的唯一方法.服务重新启动后,与其他设备的蓝牙连接将丢失.
根据链接问题中的答案,startForeground()"降低了服务被杀的可能性,但并未阻止它".我理解是这样的,但是我已经看到很多其他应用程序没有这个问题的例子(例如,Tasker).
如果服务能够在用户停止之前运行,我的应用程序的实用性将大大降低.有什么办法可以避免这个???
每当服务停止时,我都会在logcat中看到这个:
ActivityManager: No longer want com.howettl.textab (pid 32321): hidden #16
WindowManager: WIN DEATH: Window{40e2d968 com.howettl.textab/com.howettl.textab.TexTab paused=false
ActivityManager: Scheduling restart of crashed service com.howettl.textab/.TexTabService in 5000ms
Run Code Online (Sandbox Code Playgroud)
编辑:我还应该注意,这似乎没有出现在我连接的其他设备上:HTC Legend运行Cyanogen
编辑:这是输出adb shell dumpsys activity services:
* ServiceRecord{40f632e8 com.howettl.textab/.TexTabService}
intent={cmp=com.howettl.textab/.TexTabService}
packageName=com.howettl.textab
processName=com.howettl.textab
baseDir=/data/app/com.howettl.textab-1.apk
resDir=/data/app/com.howettl.textab-1.apk
dataDir=/data/data/com.howettl.textab
app=ProcessRecord{40bb0098 2995:com.howettl.textab/10104}
isForeground=true foregroundId=2 foregroundNoti=Notification(contentView=com.howettl.textab/0x1090087 vibrate=null,sound=null,defaults=0x0,flags=0x6a)
createTime=-25m42s123ms lastActivity=-25m42s27ms
executingStart=-25m42s27ms restartTime=-25m42s124ms
startRequested=true stopIfKilled=false callStart=true lastStartId=1
Bindings:
* IntentBindRecord{40a02618}:
intent={cmp=com.howettl.textab/.TexTabService}
binder=android.os.BinderProxy@40a9ff70
requested=true received=true hasBound=true doRebind=false
* Client AppBindRecord{40a3b780 ProcessRecord{40bb0098 …Run Code Online (Sandbox Code Playgroud) 我有一个包含ViewPager的片段.ViewPager与包含一组片段的适配器相关联.
在加载父片段后,我遇到了一条IllegalStateException消息:java.lang.IllegalStateException: Recursive entry to executePendingTransactions.
一些研究使我得出结论,系统无法在另一个片段中显示片段,但是似乎有一些迹象表明可以通过使用ViewPager完成此操作(ViewPager中的一个错误与其他片段一起使用)).
实际上,如果我向我的父片段添加一个按钮,mPager.setAdapter(mAdapter)在按下时调用我的ViewPager,ViewPager会成功加载.这不太理想.
那么问题必须与片段生命周期有关.因此,我的问题是:有没有其他人找到解决这个问题的办法,如果是,怎么办?
有没有办法在片段事务之后延迟ViewPager上的适配器设置?
这是我的父片段代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
final Button button = (Button)mView.findViewById(R.id.load_viewpager_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setAdapter(mAdapter);
button.setVisibility(View.GONE);
}
});
mAdapter = new ViewPagerAdapter(getFragmentManager());
// mViewPager.setAdapter(mAdapter);
return mView;
}
Run Code Online (Sandbox Code Playgroud)
和适配器:
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments android-viewpager android-nested-fragment
我有一个相当复杂的布局(包含RelativeLayouts,TextViews和ImageViews),我想放在listview上面.此视图应滚动列表视图.
我尝试使用以下代码将布局作为标题添加到listview:
View v = inflater.inflate(R.layout.list_view, container, false);
View header = inflater.inflate(R.layout.header_layout, container, false);
// populate views in the header
mList = (ListView)v.findViewById(R.id.list);
mList.addHeaderView(header);
mAdapter = new ReviewsAdapter(getActivity());
mList.setAdapter(mAdapter); <-- error occurs here
Run Code Online (Sandbox Code Playgroud)
ReviewsAdapter是我编写的自定义适配器,它扩展了BaseAdapter.
执行代码后,我收到此错误:
11-25 17:19:14.802: E/AndroidRuntime(1215): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
11-25 17:19:14.802: E/AndroidRuntime(1215): at android.widget.ListView.clearRecycledState(ListView.java:513)
11-25 17:19:14.802: E/AndroidRuntime(1215): at android.widget.ListView.resetList(ListView.java:499)
11-25 17:19:14.802: E/AndroidRuntime(1215): at android.widget.ListView.setAdapter(ListView.java:442)
11-25 17:19:14.802: E/AndroidRuntime(1215): at com.coppi.storefront.product.ProductReviewsFragment.onCreateView(ProductReviewsFragment.java:104)
Run Code Online (Sandbox Code Playgroud)
如果我注释掉该mList.addHeaderView(header)行,我就不会收到错误.我也可以在没有列表视图的情况下显示标题布局.
我假设这与标题布局的内容有关,但我不确定究竟会导致它的原因.
这是标题xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="fill_parent" …Run Code Online (Sandbox Code Playgroud) 我正在使用LRUCache缓存存储在文件系统上的位图.我根据这里的示例构建了缓存:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
问题是我在使用应用程序时经常看到OutOfMemory崩溃.我相信当LRUCache驱逐图像为另一个图像腾出空间时,内存不会被释放.
当图像被驱逐时,我添加了对Bitmap.recycle()的调用:
// use 1/8 of the available memory for this memory cache
final int cacheSize = 1024 * 1024 * memClass / 8;
mImageCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount();
}
@Override
protected void entryRemoved(boolean evicted, String key, Bitmap oldBitmap, Bitmap newBitmap) {
oldBitmap.recycle();
oldBitmap = null;
}
};
Run Code Online (Sandbox Code Playgroud)
这可以解决崩溃问题,但是它也会导致图像有时不会出现在应用程序中(只是图像所在的黑色空间).任何时候我都会在Logcat中看到这条消息:Cannot generate texture from bitmap.
一个快速谷歌搜索显示这是发生,因为显示的图像已被回收.
那么这里发生了什么?为什么再循环图像仍然在LRUCache中,如果我只是在它们被删除后回收它们?实现缓存的替代方法是什么?Android文档明确指出LRUCache是可行的方法,但他们没有提到回收位图的必要性或如何做到这一点.
解决: 如果它有用给其他人,由接受的答案建议解决这个问题是不是做什么,我在做上面的代码示例(不回收的位图 …
更新:这是SDK工具R14中的一个错误.它已在2013年10月27日发布的R15中修复.更新到最新版本可以解决所接受答案中建议的问题.
我在Eclipse的Debug视图中使用LogCat窗口来诊断和修复代码中的崩溃.我注意到LogCat输出会在任何时候添加新行时自动向下滚动(但只有在你自己滚动到底部之后).
如果我等待异常堆栈跟踪出现,这很好,但是如果我试图在日志中读取内容并且在底部继续添加更多行(它会不断跳到底部,那么非常烦人)我回滚到错误,然后再次跳到底部).
当我放置它时,有没有办法让它停留在我放置的位置,但是当我到达底部时继续自动滚动?
编辑:请注意,我知道过滤器,我不认为这是一个问题的解决方案.
另一个编辑:如果我从底部向上滚动"足够远",它会自动停止滚动.足够多可能是5行或者可能是500行,它似乎与日志中有多少行有关.理想情况下,只要距离底部至少1行,它就会停止滚动.
我有一个无线连接到其他设备的服务.启用该服务后,我会持续发出通知,说明它已启用.
启用该服务后,用户将连接到另一台设备.此时,我想更新我正在进行的通知,以说明已连接的设备的名称.通过startForeground(ONGOING_NOTIFICATION, notification)使用更新的信息再次呼叫,这很容易做到; 但每次调用时,它会在条形图上闪烁通知.我真正想要的是通知在后台静默更新而不会在通知栏上闪烁,因此用户在打开通知区域之前不会知道区别.
有没有在没有调用的情况下更新通知startForeground()?
此行为仅发生在Honeycomb中.姜饼设备(我假设Froyo等)表现出理想的方式.
有没有人知道在活动中何时使用savedInstanceState包的详尽列表?
我知道它在设备方向改变时使用.但是,当用户强制从Android设置关闭应用程序时似乎没有使用它,但这可能是由于我的代码中的某些内容.
还有哪些其他案例?
要清楚,"used"是指onCreate()调用时,savedInstanceState包不为null,并包含我上次onSaveInstanceState()调用时传入的数据.
我有三个9补丁PNG,它们组成了按钮的背景(左侧,中间,右侧).我想将这三个图像组合在一个drawable中,我可以将其指定为XML中按钮的背景,类似于:
res/drawable/button_background.xml:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/button_left_side" />
<nine-patch android:src="@drawable/button_middle" />
<nine-patch android:src="@drawable/button_right_side" />
Run Code Online (Sandbox Code Playgroud)
res/layout/main.xml:
<button android:background="@drawable/button_background" />
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我正在使用库22.1版中AppCompatActivity引入的新功能AppCompat.
当我扩展此Activity时,硬件后退按钮不再弹出我的Fragments的后堆栈,而是关闭Activity.
以下是我在活动中更改片段的方式:
public void changeFragment(Fragment f) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment_holder, f);
ft.addToBackStack(null);
ft.commit();
}
Run Code Online (Sandbox Code Playgroud)
如果我改变MainActivity extends AppCompatActivity对MainActivity extends Activity问题是否会消失,我能够通过我的片段倒退.
更改呼叫getFragmentManager()到getSupportFragmentManager()运行Android <5.0不失材料的主题,这是贯彻的主要原因在设备的结果AppCompatActivity摆在首位.
我的清单中引用的样式 <application android:theme="@style/AppTheme">
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/primary_material_light</item>
<item name="colorPrimaryDark">@color/primary_dark_material_light</item>
<item name="colorAccent">@color/accent_material_light</item>
</style>
Run Code Online (Sandbox Code Playgroud)