"避免传递null作为视图根"用popupwindow

时间:2014-11-11 08:30:51

标签: android android-layout null popupwindow layout-inflater

所以,我的程序运行正常。我只留下了三个警告(每个弹出窗口都有一个警告)并且它让我很烦恼,我一直在寻找能够满足我需求的解决方案,但我似乎无法找到一个。

这是我的代码(其他两个popupwindows相似)

else if(id == R.id.action_resetstats){
        LayoutInflater layoutInflater  = (LayoutInflater)getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
        View popupView = layoutInflater.inflate(R.layout.resetpop, null);
        final PopupWindow popupWindow = new PopupWindow(popupView,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        Button yesDismiss = (Button)popupView.findViewById(R.id.yesDismiss);
        yesDismiss.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View v){
                SharedPreferences prefs = getSharedPreferences(savedData, Context.MODE_PRIVATE);
                Editor editor = prefs.edit();
                editor.clear();
                editor.commit();

                counterW = 0;
                counterL = 0;
                counterT = 0;
                counterTot = 0;
                timerTime = 3;

                popupWindow.dismiss();
            }
        });    

        popupWindow.showAsDropDown(yeDismiss, 50, 50);


        Button noDismiss = (Button)popupView.findViewById(R.id.noDismiss);
        noDismiss.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View v){
                popupWindow.dismiss();
            }
        });    

        popupWindow.showAsDropDown(naDismiss, 50, 50);

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_margin="5dp"
android:background="@android:color/black"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">

<RelativeLayout
    android:layout_width="230dp"
    android:layout_height="300dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:layout_margin="2dp"
    android:background="@android:color/darker_gray"
    android:orientation="vertical" >

    <Button
        android:id="@+id/noDismiss"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:text="NO!" />

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:orientation="vertical" >

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="       Reset stats?"
            android:textSize="22sp" />
    </RelativeLayout>

    <Button
        android:id="@+id/yesDismiss"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:text="Yes" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/relativeLayout1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="34dp"
        android:text="Are you sure you want " />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:text="to reset your statistics?" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="39dp"
        android:text="!CANNOT BE UNDONE!" />

</RelativeLayout>

</RelativeLayout>

问题在于解决问题:

View popupView = layoutInflater.inflate(R.layout.resetpop, null);

并且警告说:

Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element)

任何想法如何解决这个最好的方法?提前谢谢!

3 个答案:

答案 0 :(得分:6)

你可以使用:

context = popupView.getContext();
inflater.inflate(R.layout.resetpop, new LinearLayout(context), false);

那应该解决警告。

答案 1 :(得分:1)

当您在下面编写代码博客时,您的意思是使用父级扩展此布局,将其附加到父级,但由于传递null,inflater将无法附加新父级

View popupView = layoutInflater.inflate(R.layout.resetpop, null);

LayoutInflater class -->

  350
  351    public View More ...inflate(int resource, ViewGroup root) {
  352        return inflate(resource, root, root != null);
  353    }

但是,它会在给定的父母身上膨胀,但不会将其附加到新的父母身上。

View popupView = layoutInflater.inflate(R.layout.resetpop, new LinearLayout(context), false);

答案 2 :(得分:0)

PopupWindow性能问题和无法关闭

如果由于PopupWindow上的某些性能问题而有人偶然发现这里。

这是您启动PopupWindow的时间,但只是冻结整个屏幕,除非重新启动应用程序,否则无法继续。发生在较旧的设备上,我的碰巧是三星GT-N7100(API 19)。

好吧,我尝试使用LayoutInflater时解决警告。但是,并没有解决滞后的问题。

步骤1-将视图设置为使用软件加速渲染

根据此论坛帖子,我所要做的就是将视图设置为对该视图使用软件加速。然后,一切都好似雨。

https://androidforums.com/threads/android-popupwindow-performance-issues.882794/

val popupView = inflater.inflate(R.layout.popup_tooltip, null)
popupView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

第2步-将PopupWindow Focusable属性设置为关闭

此后,我仍然遇到解雇PopupWindow的问题。如果仅将focusable设置为true,则性能问题将仍然存在。

我必须手动设置属性以允许在检测到点击时将其消除。

https://stackoverflow.com/a/45408724/2867351

val popupWindow = PopupWindow(popupView, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)

popupWindow.isFocusable = true
popupWindow.isOutsideTouchable = true
popupWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

就是这样。干杯伴侣