从 onCreate 调用时方法 returns 空对象,但在 onClick 方法中 returns 正确值
A method returns null object when called from onCreate but returns correct value in onClick method
我正在使用 wuapnjie/StickerView library in my app and one of the function getCurrentSticker in StickerView class 当我在 onCreate 方法中调用该方法时返回空对象引用,但从任何 onClick 方法调用时工作正常。您的任何专业知识都会非常有帮助。谢谢。
当我尝试 运行 运行OnUiThread 中单独线程中的代码时,有时它可以工作,有时则不能。为什么有些代码有时会工作,而其他时间却不行。我很迷茫。下面是在 onClick 方法而不是 onCreate 方法中工作的代码片段。
当我在下面的代码中从 onCreate 调用 addStickerNow 时,它 returns 为空值。在 onClick 方法中它返回实际值。
public class MainActiviy extends AppCompatActivity
{
private StickerView stickerView;
private Button button;
LinearLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = findViewById(R.id.lnr_draw);
stickerView = (StickerView) findViewById(R.id.sticker_view);
button = (Button) findViewById(R.id.button3);
addStickerNow(); //It's not working.
}
public void onButtonClicked(View view)
{
addStickerNow(); //It's working.
}
public void addStickerNow()
{
stickerView.addSticker(
new TextSticker(getApplicationContext())
.setText("TEXT")
.setMaxTextSize(70)
.setTextAlign(Layout.Alignment.ALIGN_CENTER)
.setMinTextSize(100)
, Sticker.Position.TOP);
int test = 1; //1st breakpoint
Sticker sticker = stickerView.getCurrentSticker(); // 2nd breakpoint
int test2 = 1; //3rd breakpoint
}
}
我尝试按照 Mr.Hyde 的建议调试应用程序,发现从 onCreate 和 onClick 调用 addStickerNow 时存在以下差异。
*1st breakpoint, when called from onCreate
this = {MainActivity@4424}
stickerView = {StickerView@4427} "com.xiaopo.flying.sticker.StickerView{7b55d6d V.E...... ......I. 0,0-0,0 #7f070071 app:id/sticker_view}"
1st breakpoint, when called from onClick
this = {MainActivity@4424}
stickerView = {StickerView@4427} "com.xiaopo.flying.sticker.StickerView{7b55d6d V.E...... ......ID 0,160-720,760 #7f070071 app:id/sticker_view}"*
这里的主要区别是 StickerView 的 RectF 在 onCreate 调用时是 0,0-0,0 和 0,160-720,760 从 onClick 调用时。所以它与布局创建有关。
布局文件如下。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/parent_layout"
tools:context="e.venkihero.stickerviewtest.MainActivity">
<LinearLayout
android:id="@+id/lnr_draw"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:gravity="center"
android:orientation="vertical">
<com.xiaopo.flying.sticker.StickerView
android:id="@+id/sticker_view"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:layout_gravity="center"
app:showIcons="true">
<ImageView
android:id="@+id/img_bg1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
android:scaleType="fitXY" />
</com.xiaopo.flying.sticker.StickerView>
</LinearLayout>
<Button
android:id="@+id/button3"
android:layout_width="100dp"
android:layout_height="100dp"
android:onClick="onButtonClicked"
android:clickable="true" />
</LinearLayout>
如果有人能解释为什么这段代码(位于顶部)在 onClick 方法中运行良好,但在 onCreate 方法中返回空对象引用,那将非常有帮助。谢谢。
StickerView 似乎依赖于您的整体布局来绘制自己。因为在 onCreate 你的布局没有绘制在你的 Activity 所以你的 StickerView 的 Rect 都是 0.
在 onCreate
中添加以下代码以等待绘制布局,然后调用您的 addSticker 方法。
ViewTreeObserver vto = yourLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
vto.removeOnGlobalLayoutListener(this)
addStickerNow()
}
});
我正在使用 wuapnjie/StickerView library in my app and one of the function getCurrentSticker in StickerView class 当我在 onCreate 方法中调用该方法时返回空对象引用,但从任何 onClick 方法调用时工作正常。您的任何专业知识都会非常有帮助。谢谢。
当我尝试 运行 运行OnUiThread 中单独线程中的代码时,有时它可以工作,有时则不能。为什么有些代码有时会工作,而其他时间却不行。我很迷茫。下面是在 onClick 方法而不是 onCreate 方法中工作的代码片段。
当我在下面的代码中从 onCreate 调用 addStickerNow 时,它 returns 为空值。在 onClick 方法中它返回实际值。
public class MainActiviy extends AppCompatActivity
{
private StickerView stickerView;
private Button button;
LinearLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = findViewById(R.id.lnr_draw);
stickerView = (StickerView) findViewById(R.id.sticker_view);
button = (Button) findViewById(R.id.button3);
addStickerNow(); //It's not working.
}
public void onButtonClicked(View view)
{
addStickerNow(); //It's working.
}
public void addStickerNow()
{
stickerView.addSticker(
new TextSticker(getApplicationContext())
.setText("TEXT")
.setMaxTextSize(70)
.setTextAlign(Layout.Alignment.ALIGN_CENTER)
.setMinTextSize(100)
, Sticker.Position.TOP);
int test = 1; //1st breakpoint
Sticker sticker = stickerView.getCurrentSticker(); // 2nd breakpoint
int test2 = 1; //3rd breakpoint
}
}
我尝试按照 Mr.Hyde 的建议调试应用程序,发现从 onCreate 和 onClick 调用 addStickerNow 时存在以下差异。
*1st breakpoint, when called from onCreate
this = {MainActivity@4424}
stickerView = {StickerView@4427} "com.xiaopo.flying.sticker.StickerView{7b55d6d V.E...... ......I. 0,0-0,0 #7f070071 app:id/sticker_view}"
1st breakpoint, when called from onClick
this = {MainActivity@4424}
stickerView = {StickerView@4427} "com.xiaopo.flying.sticker.StickerView{7b55d6d V.E...... ......ID 0,160-720,760 #7f070071 app:id/sticker_view}"*
这里的主要区别是 StickerView 的 RectF 在 onCreate 调用时是 0,0-0,0 和 0,160-720,760 从 onClick 调用时。所以它与布局创建有关。
布局文件如下。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/parent_layout"
tools:context="e.venkihero.stickerviewtest.MainActivity">
<LinearLayout
android:id="@+id/lnr_draw"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:gravity="center"
android:orientation="vertical">
<com.xiaopo.flying.sticker.StickerView
android:id="@+id/sticker_view"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:layout_gravity="center"
app:showIcons="true">
<ImageView
android:id="@+id/img_bg1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
android:scaleType="fitXY" />
</com.xiaopo.flying.sticker.StickerView>
</LinearLayout>
<Button
android:id="@+id/button3"
android:layout_width="100dp"
android:layout_height="100dp"
android:onClick="onButtonClicked"
android:clickable="true" />
</LinearLayout>
如果有人能解释为什么这段代码(位于顶部)在 onClick 方法中运行良好,但在 onCreate 方法中返回空对象引用,那将非常有帮助。谢谢。
StickerView 似乎依赖于您的整体布局来绘制自己。因为在 onCreate 你的布局没有绘制在你的 Activity 所以你的 StickerView 的 Rect 都是 0.
在 onCreate
中添加以下代码以等待绘制布局,然后调用您的 addSticker 方法。
ViewTreeObserver vto = yourLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
vto.removeOnGlobalLayoutListener(this)
addStickerNow()
}
});