我有一个音乐播放器,试图启动Service
中onResume()
的一个Activity
.为清晰起见,我删除了几行,但代码有效:
@Override
protected void onResume() {
super.onResume();
startService(new Intent(this, MusicService.class));
}
Run Code Online (Sandbox Code Playgroud)
根据崩溃日志,这在运行Android P的某些设备上抛出异常:
Caused by java.lang.IllegalStateException: Not allowed to start service Intent { cmp=another.music.player/com.simplecity.amp_library.playback.MusicService }: app is in background uid UidRecord{6a4a9c6 u0a143 TPSL bg:+3m25s199ms idle change:cached procs:1 seq(1283,1283,1283)}
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1577)
at android.app.ContextImpl.startService(ContextImpl.java:1532)
at android.content.ContextWrapper.startService(ContextWrapper.java:664)
at android.content.ContextWrapper.startService(ContextWrapper.java:664)
at com.simplecity.amp_library.utils.MusicServiceConnectionUtils.bindToService(SourceFile:36)
at com.simplecity.amp_library.ui.activities.BaseActivity.bindService(SourceFile:129)
at com.simplecity.amp_library.ui.activities.BaseActivity.onResume(SourceFile:96)
Run Code Online (Sandbox Code Playgroud)
在调用onResume()
(和super.onResume()
)之后,我的应用程序是如何处于后台的?
这对我没有任何意义.这可能是一个平台错误吗?受此次崩溃影响的所有3500多名用户都在Android P.
我有一个活动,最初主持一个ViewPager,连接到FragmentPagerAdapter.
当用户点击ViewPager的子片段中的项目时,我正在使用FragmentTransaction将空容器视图替换为我想要导航到的新片段.
如果我在事务上使用addToBackStack(),提交事务然后导航回来,我不会返回到ViewPager的视图(初始布局).
如果我不在事务上使用addToBackStack(),提交事务然后导航回来,应用程序退出.
很明显ViewPager没有被添加到backstack中(这并不令人惊讶,因为它本身不是一个片段).但是我希望默认行为是背压将我带回到那个活动的初始阶段.查看(ViewPager).
基于我所读到的内容,似乎可能是因为片段事务正在发生,ViewPager或PagerAdapter会丢失应该显示哪个片段的跟踪.
我真的对此感到困惑,但我最终创建了一大堆代码覆盖了onBackPress并显示和隐藏了viewpager视图.我认为有一种更简单的方法可以使用默认行为来执行适当的导航.
TL;博士
A是一个托管片段的Viewpager.B是一个新片段.
当我用B替换A,然后按回来时,我希望导航回A,但这不会发生.
任何建议将不胜感激.
码:
主要活动:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
headingLayout = (RelativeLayout) findViewById(R.id.headingLayout);
headingLayout.setVisibility(View.GONE);
// Set up the ViewPager, attaching the adapter and setting up a listener
// for when the
// user swipes between sections.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setPageMargin(8);
/** Getting fragment manager */
FragmentManager fm = getSupportFragmentManager();
/** Instantiating FragmentPagerAdapter */
MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);
/** Setting the pagerAdapter to the pager object */ …
Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentpageradapter
我正在使用productFlavors并尝试根据风格更改packageName:
productFlavors {
flavor1 {
packageName "com.mypackagename.one"
}
flavor2 {
packageName "com.mypackagename.two"
}
}
Run Code Online (Sandbox Code Playgroud)
这个工作正常,直到我更新到Gradle 0.14.4,现在它失败并显示以下消息:
Error:(21, 0) Gradle DSL method not found: 'packageName()'
Possible causes:
The project 'MyProject' may be using a version of Gradle that does not contain the method.
<a href="open.wrapper.file">Open Gradle wrapper file</a>
The build file may be missing a Gradle plugin.
<a href="apply.gradle.plugin">Apply Gradle plugin</a>
Run Code Online (Sandbox Code Playgroud)
如何解决此问题,同时保留更改我的口味的packageNames的能力?
如果这只是因为方法名称已更改,我在哪里可以找到有关这些更改的信息?我似乎无法找到相关的更改日志,或更新的文档解释如何执行此操作.
我有一个拆分ActionBar,我正在尝试添加几乎与谷歌播放'现在播放'相同的功能..
我可以使用onCreateOptionsMenu让菜单项显示在屏幕底部,但是当使用actionBar.setCustomView时,我似乎无法在屏幕底部显示自定义视图.自定义视图位于顶部ActionBar下方.
有谁知道如何将自定义视图强制到底部,或者将自定义视图添加到onCreateOptionsMenu?
以下是我的代码片段:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
//Custom view to add
actionBar.setCustomView(R.layout.albumitem);
//This view shows up just under the top actionbar at the moment,
despite menu items being at the bottom
Run Code Online (Sandbox Code Playgroud)
菜单选项代码:(这些显示在我想要自定义视图的底部)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
new MenuInflater(this).inflate(R.menu.option_menu, menu);
return (super.onCreateOptionsMenu(menu));
}
Run Code Online (Sandbox Code Playgroud)
我相信谷歌播放音乐应用程序底部现在播放的菜单是一个分割操作栏内的自定义视图:
我有一个内部的溢出按钮CardView
在Recyclerview
.每当我点击按钮时,我会显示一个弹出菜单,但也会RecyclerView
向下滚动一个项目.谁能帮助我阻止这种不必要的滚动?
基本上我试图复制与Playstore中相同的溢出按钮行为.
布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp">
<android.support.v7.widget.CardView
android:id="@+id/cv_tracks"
android:layout_width="match_parent"
android:layout_height="65dp"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="60dp">
<ImageView
android:id="@+id/ivTracks"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/unknown"
/>
<Button
android:id="@+id/imgbtn_overflow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:drawableTop="@drawable/ic_overflow"
android:paddingLeft="25dp"
android:paddingRight="20dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
适配器:
@Override
public void onBindViewHolder(final TracksViewHolder tracksViewHolder, int i) {
tracksViewHolder.imgBtnOverflow.setTag(i);
tracksViewHolder.imgBtnOverflow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Creating the instance of PopupMenu
final int position = (Integer) v.getTag();
PopupMenu popup = new PopupMenu(mContext,tracksViewHolder.imgBtnOverflow);
//Inflating the …
Run Code Online (Sandbox Code Playgroud) 我有一个RecyclerView
使用LinearLayoutManager
与HORIZONTAL
方向,嵌套在FrameLayout
使用BottomSheet
Behavior
.
当尝试垂直拖动时RecyclerView
,BottomSheet
不会响应拖动事件.据推测这是因为对于LayoutManager
具有水平方向的垂直滚动被禁用.
我已经尝试重写LinearLayoutManager.canScrollVertically()
并返回true.这种形式的作品.如果你在一个非常谨慎的方式垂直拖动时,BottomSheet
会作出回应.然而,只要涉及任何水平移动,BottomSheet
停止响应垂直拖动事件.
我不确定覆盖canScrollVertically()
是否是正确的方法 - 从用户体验的角度来看,它肯定是不对的.
我还注意到,如果我使用的是水平方向ViewPager
而不是RecyclerView
水平方向LayoutManager
,则会BottomSheet
根据需要响应垂直滑动事件.
是否有一些其他的方法LayoutManager
,RecyclerView
,BottomSheet Behavior
,或者干脆东西,可以帮助传播到垂直滚动的事件BottomSheet Behavior
?
这里有一个问题的例子:
https://github.com/timusus/bottomsheet-test (问题可以通过提交#f59a7031转载)
只需展开第一个底页.
android android-recyclerview androiddesignsupport bottom-sheet
我有一个嵌套在另一个底部工作表内的底部工作表(FrameLayouts
使用BottomSheet
布局行为)
我还有几个'peek views'(FrameLayouts
)附加了点击监听器,在点击时分别展开底部工作表.
因此该应用程序基本上有3个主屏幕."主容器",然后是第一个"底部薄片",可以全屏展开,然后在第一个底部薄片的底部,是第二个底部薄片,也可以全屏展开.
问题:
当我RecyclerView
向嵌套的底部工作表'容器'视图添加a时,拖动停止工作以进行第二个peek视图(Sheet 2 Peek).如果我删除偷看视图ClickListener
或在RecyclerView
,事情似乎完全正常工作.
期望的结果:
两个底部工作表都应保持可拖动状态,并且应该可以单击窥视视图以展开其父底部工作表.底部工作表应该像通常那样响应嵌套的滚动.
我尝试删除ClickListener
并使用触摸手势,但我尝试过的任何东西似乎都没有帮助.
我正在使用v25.3.1
设计支持库,我能够在运行4.4.4库存的Galaxy S4和运行7.1.2库存的Nexus 6P上重现此问题.(我没有任何其他设备可用).
我还在github上为有兴趣仔细研究的人创建了一个测试项目:https: //github.com/timusus/bottomsheet-test
这是一些展示布局的屏幕截图:
布局结构如下所示(为清晰起见,省略了一些代码):
<CoordinatorLayout>
<FrameLayout
android:id="@+id/mainContainer"
android:layout_height="match_parent"/>
<FrameLayout
android:id="@+id/sheet1"
android:layout_height="match_parent"
app:layout_behavior="CustomBottomSheetBehavior"
app:behavior_peekHeight="64dp">
<FrameLayout
android:id="@+id/sheet1Container"
android:layout_height="match_parent"/>
<CoordinatorLayout>
<FrameLayout
android:id="@+id/sheet2
android:layout_height="match_parent"
app:layout_behavior="CustomBottomSheetBehavior"
app:behavior_peekHeight="64dp">
<FrameLayout
android:id="@+id/sheet2Container"
android:layout_height="match_parent">
<!-- Problematic RecyclerView -->
<RecyclerView
android:layout_height="match_parent"/>
</FrameLayout>
<!-- Problematic Click Listener on this view -->
<FrameLayout
android:id="@+id/sheet2PeekView"
android:layout_height=64dp"/>
</FrameLayout>
</CoordinatorLayout>
<FrameLayout
android:id="@+id/sheet1PeekView" …
Run Code Online (Sandbox Code Playgroud) android android-recyclerview androiddesignsupport bottom-sheet
我有一个StateFlow
在我的应用程序的各个部分之间共享的协程。当我cancel
在CoroutineScope
下游收集器的,一个JobCancellationException
被传播到StateFlow
,并停止对所有当前和未来集电极发射值。
的StateFlow
:
val songsRelay: Flow<List<Song>> by lazy {
MutableStateFlow<List<Song>?>(null).apply {
CoroutineScope(Dispatchers.IO)
.launch { songDataDao.getAll().distinctUntilChanged().collect { value = it } }
}.filterNotNull()
}
Run Code Online (Sandbox Code Playgroud)
我的代码中的典型“演示者”实现了以下基类:
abstract class BasePresenter<T : Any> : BaseContract.Presenter<T> {
var view: T? = null
private val job by lazy {
Job()
}
private val coroutineScope by lazy { CoroutineScope( job + Dispatchers.Main) }
override fun bindView(view: T) {
this.view = view
}
override fun unbindView() { …
Run Code Online (Sandbox Code Playgroud) 虽然有很多教程,但我发现很难实现AsyncTask将URI(从内容提供者获得)加载到自定义适配器中.
我得到了基本的要点,即有一个包含AsyncTask的类,在'doInBackground'中创建位图,然后在onPostExecute中设置ImageView.
对于我来说,对于android和编程来说,新的问题是,我不知道如何将每个项目的Uri传递给AsyncTask,如何创建位图,以及如何将其返回到适配器.
我只用实际的AsyncTask类(ImageLoader)来实现这一点:
package another.music.player;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.widget.ImageView;
public class ImageLoader extends AsyncTask<String, String, Bitmap> {
private ImageView imageView;
private Bitmap bitmap = null;
@Override
protected Bitmap doInBackground(String... uri) {
// Create bitmap from passed in Uri here
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null && imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的自定义适配器看起来像这样:
package another.music.player;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.provider.MediaStore.Audio.AlbumColumns;
import …
Run Code Online (Sandbox Code Playgroud) 在主题中声明.NoActionBar之后,以及放入toolbar
布局中,我toolbar
没有显示.我最终得到的正是你在宣布没有动作栏时所期望的 - 没有动作栏.这是布局:
activity_home.xml:
<include
layout="@layout/app_bar_home"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_home"
app:menu="@menu/activity_home_drawer"/>
Run Code Online (Sandbox Code Playgroud)
app_bar_home.xml
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_home"/>
Run Code Online (Sandbox Code Playgroud)
在我的主要活动中,我有一个动作栏NAVIGATION_MODE_TABS
.每个选项卡的内容都是一个listfragment.
我想这样做,以便在单击一个列表项时,一个新的片段进入视图,并将操作栏模式更改为NAVIGATION_MODE_STANDARD
(以便现在隐藏选项卡).
我已设法使用以下代码:
在listitemclick方法中:
ActionBar actionBar = getActivity().getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
Fragment albumListFragment = new AlbumListFragment();
albumListFragment.setArguments(bundle);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(android.R.id.content, albumListFragment);
ft.addToBackStack(null);
// Commit the transaction
ft.commit();
Log.i("FragmentList", "Item clicked: " + id);
Run Code Online (Sandbox Code Playgroud)
问题是当我按下后退按钮时,标签仍然消失,前一个片段不会返回到视图中.
我做错了什么..是否与碎片堆叠有关?我应该采取另一种方式,甚至覆盖背压吗?
- 编辑 -
为清楚起见 - 我在调用fragmenttransaction.replace时调用addToBackStack,但是当我按下后退按钮时,前一个片段不会被恢复.
我有一个带有操作栏和动作栏标签的活动.当我从选项卡的内容中选择一个项目时,我正在尝试用新的替换当前片段,将事务添加到后台堆栈,并隐藏选项卡.
我通过将操作栏导航模式更改为标准来隐藏选项卡.
问题是,当我按下后退按钮时,我只是使用操作栏获得一个空白视图(在标准模式下)..片段事务似乎没有被反转.
如果我不通过将导航模式更改为标准来隐藏选项卡,则事务反转工作正常.
我已经尝试覆盖背面按下以将导航模式更改回选项卡,但它不起作用.
有人能告诉我他们将如何实现这一目标吗?
以下是隐藏选项卡并执行片段事务的代码:
ActionBar actionBar = getActivity().getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
Fragment albumListFragment = new AlbumListFragment();
albumListFragment.setArguments(bundle);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(android.R.id.content, albumListFragment);
ft.addToBackStack(null);
// Commit the transaction
ft.commit();
Run Code Online (Sandbox Code Playgroud)
为清楚起见:我希望在提交此事务后回退,标签将返回到前一个片段的视图.在按下后,它没有显示标签或片段.
我有一个UITextView
带有一些属性文本的文本,其中textContainer.maximumNumberOfLine
设置了(在这种情况下为 3)。
我想在属性字符串的字符范围内找到省略号字符的索引。
例如:
原始字符串:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit"
截断后显示的字符串:
Lorem ipsum
dolor sit amet,
consectetur...
我如何确定 的索引...
?
android ×12
bottom-sheet ×2
adapter ×1
appbar ×1
back-stack ×1
build.gradle ×1
ios ×1
kotlin ×1
lazy-loading ×1
popupmenu ×1
truncation ×1
uitextview ×1