我最近开始使用片段创建了一个演示应用程序,如下所示:

单击每个按钮可在片段1,片段2和片段3之间切换.
我想要完成的是每个Fragment只有一个实例并重用它.(请注意,所有片段都是动态创建和添加的).目前我这样做是通过创建片段的HashMap并放置每个实例并从那里抓取它.
所以我的问题是:有没有更好的方法:使用FragmentManager的putFragment(...)方法?putFragment (Bundle bundle, String key, Fragment fragment)在我的情况下,我无法弄清楚如何使用它.如果有人能给我一个如何使用这种方法的例子.
在我的活动中保留每个片段的引用是否昂贵?这会使所有碎片保持活力吗?我正在使用软参考来解决这个问题,但我不确定这是否是正确的方法.请指出我这样做的任何其他方式或让我知道这是否是实现这一目标的最佳方式.
提前致谢.
这是我的代码:
更新:我正在尝试重用后端堆栈中的片段,尝试仅在后端堆栈中不存在时添加它们.在我离开片段1之后,下面的代码给了我非法状态异常 - >回到它 - >然后尝试按下后退按钮:
10-28 13:21:40.255: ERROR/MessageQueue-JNI(3548): java.lang.IllegalStateException: Fragment already added: FragmentOne{423db570 #0 id=0x7f050006 fragOne}
public class MainActivity extends Activity implements View.OnClickListener {
private Button btnOne;
private Button btnTwo;
private Button btnThree;
/* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initialize();
if(findViewById(R.id.fl) != null){
if(savedInstanceState != null)
return;
}
FragmentManager.enableDebugLogging(true);
updateView("fragOne");
}
private void …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何用角度绑定工具提示的内容.我有一个看起来像这样的指令:
的script.js
var myApp = angular.module('myApp', []);
myApp.directive('initToolbar', function(){
return {
restrict: 'A',
link: function(scope, element, attrs)
{
$(element).qtip({
content: {
ajax:
{
url: 'button.html'
}
},
position: {
my: 'bottom left',
at: 'bottom middle',
target: $(element)
},
hide: {
fixed : true,
delay : 1000
}
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
它使用此处的qTip2插件
我的index.html像这样(请注意,在实际的文件我已经包括在头部的所有来源,我只是不在这里粘贴以避免混乱):
<body>
<div initToolbar>
<p>
Hover over me. Hover over me. Hover over me.
</p>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
和
button.html
<div ng-controller="myController">
<button ng-click="someFunction()">Click me</button>
</div>
Run Code Online (Sandbox Code Playgroud)
正如您在指令代码中看到的那样.button.html被加载到工具提示中,但这会阻止角度正常运行 …
鉴于以下设置:
我有2个存储库:存储库A和存储库B它们都返回实时数据.
我有一个使用这两个存储库的ViewModel.
我想从Repository A中提取一些内容,并根据结果我想从Repository B中获取一些东西,然后在返回UI之前转换结果.
为此我一直在看LiveData Transformation类.这些例子显示了结果的单一转换,但是我想要链接两个转换的行.我怎么能做到这一点?
我尝试过像这样设置但在第二个转换块上出现类型不匹配:
internal val launchStatus: LiveData<String> = Transformations
.map(respositoryA.getData(), { data ->
if (data.isValid){
"stringA"
} else {
//This gives a type mismatch for the entire block
Transformations.map(repositoryB.getData(), {
result -> result.toString()
})
}
})
Run Code Online (Sandbox Code Playgroud)
(另请告诉我是否有替代/推荐的方法来抓取链接这些呼叫的东西,即从A抓取一些东西然后根据A的结果从B中抓取一些东西,依此类推)
android kotlin android-livedata android-architecture-components
我的最终目标是在文本选择上创建工具提示.然后,用户将能够与类似的工具提示进行交互
.请注意,我能够通过将选定的文本包装在标签中然后在其上创建工具提示来实现此目的,但由于某些其他要求和功能问题,这不再是我的选择.如果您在元素检查器中的上图中注意到,所选文本未包含在任何类型的标记中,则仅在选择上创建工具提示.我已经看过这个并且它对我不起作用,因为鼠标位置可能与选择结束不同.我需要实际的选择位置.
一般问题:实现这一目标的最佳方法是什么?更具体的问题:
我在下面创建了一个非常简化的版本。
严格模式通过以下策略设置:
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.penaltyDeath()
.build()
)
Run Code Online (Sandbox Code Playgroud)
视图模型只有一个函数,该函数在调用时会使应用程序崩溃。该函数不执行任何操作(其主体为空)
class MyViewModel : ViewModel() {
fun foo() {
viewModelScope.launch(Dispatchers.IO){ }
}
}
Run Code Online (Sandbox Code Playgroud)
该活动通过以下跟踪viewModel.foo()在onCreate其中调用使应用程序崩溃。
--------- beginning of crash
2019-04-08 22:07:49.579 1471-1471/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 1471
java.lang.RuntimeException: StrictMode ThreadPolicy violation
at android.os.StrictMode$AndroidBlockGuardPolicy.onThreadPolicyViolation(StrictMode.java:1705)
at android.os.StrictMode$AndroidBlockGuardPolicy.lambda$handleViolationWithTimingAttempt$0(StrictMode.java:1619)
at android.os.-$$Lambda$StrictMode$AndroidBlockGuardPolicy$9nBulCQKaMajrWr41SB7f7YRT1I.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: android.os.strictmode.DiskReadViolation …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,需要我从视频中检索帧并对其进行一些处理。然而,帧检索似乎非常慢,以至于无法接受。有时检索单个帧需要长达 2.5 秒的时间。我正在使用MediaMetadataRetriever作为大多数 stackoverflow 问题的建议。然而性能却非常糟糕。这是我所拥有的:
\n\n private List<Bitmap> retrieveFrames() {\n\n MediaMetadataRetriever fmmr = new MediaMetadataRetriever();\n fmmr.setDataSource("/path/to/some/video.mp4");\n String strLength = fmmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);\n long milliSecs = Long.parseLong(strLength);\n long microSecLength = milliSecs * 1000;\n\n Log.d("TAG", "length: " + microSecLength);\n long one_sec = 1000000; // one sec in micro seconds\n\n ArrayList<Bitmap> frames = new ArrayList<>();\n int j = 0;\n for (int i = 0; i < microSecLength; i += (one_sec / 5)) {\n long time = System.currentTimeMillis();\n Bitmap frame = fmmr.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST);\n j++;\n …Run Code Online (Sandbox Code Playgroud) 我正在努力使用 compose 来实现 MVI。为了让我遵循正确的事件循环,我需要通过我的视图模型传播点击事件,然后观察副作用。我研究了一些实现,它们都用于LaunchedEffect(true)观察副作用并采取行动。
我有一个类似的设置,例如:
@Composable
fun HelloComposeScreen(
viewModel: MyViewModel = hiltViewModel(),
onClickedNext: () -> Unit
) {
LaunchedEffect(true) {
viewModel.sideEffect.collectLatest { sideEffect ->
when (sideEffect) {
DashboardSideEffect.CreateParty -> onClickedNext()
}
}
}
Button(
onClick = { viewModel.onEvent(UserEvent.ClickedButton)},
) {
Text("Click Me")
}
}
Run Code Online (Sandbox Code Playgroud)
这导致我使用LaunchedEffect(true)任何具有导航或一次性事件的屏幕,但官方文档有此警告
警告:LaunchedEffect(true) 与 while(true) 一样可疑。尽管它有有效的用例,但请始终停下来并确保这就是您所需要的。
我的问题是:
LaunchedEffect?文档说它与调用站点的生命周期相匹配。这是本例中的组成吗?LaunchedEffect(true)设置来观察我的项目的副作用吗?有什么替代方案吗?的文档SnapshotStateList指出它类似于常规的可变列表。我有一个用例,我需要修改列表 ( ) 中的所有元素set case。这不会改变列表的大小,但我遇到了 ConcurrentModificationException。
我在这里创建了一个非常简化的用例版本。以下 kotlin 列表运行良好:
val myList2 = mutableListOf("a", "b", "c")
myList2.forEachIndexed { index, _ ->
// Modify item at index
myList2[index] = "x"
}
Run Code Online (Sandbox Code Playgroud)
但我在这里遇到并发修改异常:
val myList = mutableStateListOf("a", "b", "c")
myList.forEachIndexed { index, _ ->
// Modify item at index but I get an exception
myList[index] = "x"
}
Run Code Online (Sandbox Code Playgroud)
如何修改mutableStateList()in place 的所有元素而不出现并发修改异常?
编辑:
我可以创建一个副本mutableStateList来迭代它,它工作得很好,但由于我没有更改列表的大小,是否可以就地执行它?
我有一个允许用户与通知交互的应用程序。这是一个简单的用例:当用户点击“操作”时,应用程序会进行一些处理并更新通知以显示进度并再次更新以显示操作是否成功。
在 26 之前,我能够在单个通知上设置声音/振动,因此一旦用户单击“操作”,到进度状态的转换将不会发出声音/振动(我想要的行为),但是使用 26,似乎不再尊重这些论点,声音/振动设置仅在通道级别受到尊重。
我的初始通知应该发出声音/振动,但如果我正在更新现有通知(即更改为进度状态),则不应发出声音/振动。有没有办法在 API 26 及更高版本上实现这一点?
这是设置初始状态的代码:
private fun sendNotification() {
val builder = NotificationCompat.Builder(this, "channel_id")
val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val intent = Intent(this, MyIntentService::class.java)
val pIntent = PendingIntent.getService(this, ID, intent, PendingIntent.FLAG_UPDATE_CURRENT)
val action = NotificationCompat.Action.Builder(
R.drawable.ic_lock_open_white_24dp,
"Action",
pIntent
).build()
builder.setSmallIcon(R.drawable.ic_home_teal_600_24dp)
.setContentTitle("My Title")
.setContentText("My content text")
.setSound(defaultSoundUri)
.addAction(action)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channelName = "My Channel"
val description = "Channel Description"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel("channel_id", …Run Code Online (Sandbox Code Playgroud) 我有一个折叠的工具栏布局,如下所示:
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/expanded_toolbar_height"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<include layout="@layout/circle_image_view"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.CollapsingToolbarLayout>
Run Code Online (Sandbox Code Playgroud)
这里circle_image_view是
<com.example.ui.CircularParseImageView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/iv_circular_backdrop"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_gravity="center"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:transitionName="@string/transition_pic"
app:layout_collapseMode="parallax" />
Run Code Online (Sandbox Code Playgroud)
这只是带有圆形蒙版的标准图像视图。展开折叠式工具栏时,圆形的“图像”视图将可见,并显示如下:
折叠后,图像视图不再可见,如下所示:
但是,即使在折叠状态下,图像视图的可见性似乎仍设置为“可见”。当用户按下“后退”按钮时,我需要确定图像是否可见以执行共享元素过渡动画。 如何确定图像在折叠工具栏中当前是否可见?
我尝试过的
getVisibility() 保持不变
isOpaque() 保持不变
getImageAlpha() 保持不变
android ×8
kotlin ×2
android-architecture-components ×1
android-collapsingtoolbarlayout ×1
angularjs ×1
ffmpeg ×1
html5 ×1
java ×1
javascript ×1
jquery ×1
qtip2 ×1
selection ×1
video ×1