Ale*_*ian 2 android fragment showcaseview
我从这里使用ShowcaseView的最新版本
当我尝试将它与演示应用程序和活动一起使用时,它可以工作,但当我尝试将它与片段一起使用时,它崩溃了我的应用程序而没有logcat错误
@override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final ImageButton saveButton = (ImageButton) view.findViewById(R.id.button_Save);
ViewTarget viewTarget = new ViewTarget(saveButton);
showcaseView = new ShowcaseView.Builder(getActivity())
.setTarget(viewTarget)
.setContentTitle("Reset Button")
.setContentText("This will erase all the data in the table except the line that in progress")
.build();
}
Run Code Online (Sandbox Code Playgroud)
这可能是什么问题?
EDIT1:
当我尝试在我的片段活动中做同样的事情并且不起作用时,但是当我做同样的事情但是采取了在片段活动中声明的视图而不是在片段中它起作用.
EDIT2: 我设法从logcat中获取错误.
FATAL EXCEPTION: main
java.lang.IllegalArgumentException: width and height must be > 0
at android.graphics.Bitmap.createBitmap(Bitmap.java:724)
at android.graphics.Bitmap.createBitmap(Bitmap.java:703)
at android.graphics.Bitmap.createBitmap(Bitmap.java:670)
at com.github.amlcurran.showcaseview.ShowcaseView.updateBitmap(ShowcaseView.java:169)
at com.github.amlcurran.showcaseview.ShowcaseView.onGlobalLayout(ShowcaseView.java:343)
at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:839)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2050)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6364)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
at android.view.Choreographer.doCallbacks(Choreographer.java:591)
at android.view.Choreographer.doFrame(Choreographer.java:561)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
我理解错误但是它的原因是什么?
在我看来,最好的解决方案是将代码放在视图的"post"回调中,这样它将在渲染所有内容时执行.
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.post(new Runnable() {
@Override
public void run() {
// your showcase initialisation code here
showcase();
}
});
}
Run Code Online (Sandbox Code Playgroud)
我测试了它并且像魅力一样工作.
这似乎是时间问题。如果调用发生之前的观点实际上是在屏幕上绘制的,它不能说的宽度和高度应> 0。这是从源代码清晰ShowcaseView,在updateBitmap()功能,它失败:
bitmapBuffer = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Run Code Online (Sandbox Code Playgroud)
在实际绘制之前,其中getMeasuredWidth()和getMeasuredHeight()为零。
解决此问题的方法是延迟调用此方法。我目前以5s的延迟使用它onResume(),并在的帮助下从调用它Handler
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
new ShowcaseView.Builder(mActivity)
.setTarget(new ViewTarget(saveMatchButton))
.setContentTitle("This is a demo")
.build();
}
}, 5000);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3530 次 |
| 最近记录: |