【问题标题】:Removing a view or range of views from a LinearLayout causes a NullPointerException in a call to unFocus从 LinearLayout 中删除视图或视图范围会导致调用 unFocus 时出现 NullPointerException
【发布时间】:2017-02-18 21:50:55
【问题描述】:

我有一个包含 LinearLayout 的 Horizo​​ntalScrollView,用于显示文件树功能区

 <HorizontalScrollView
        android:id="@+id/content_ribbon_scrollview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:scrollbars="none">

        <LinearLayout
            android:id="@+id/content_file_ribbon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

        </LinearLayout>

    </HorizontalScrollView>

当用户导航到项目时,项目会添加到 LinearLayout

void addRibbonItem(final Node node) {
        final TextView view = (TextView) getLayoutInflater().inflate(R.layout.shard_ribbon_item, mRibbon, false);
        view.setText(node.getName());

        mRibbon.addView(view);
        mRibbon.postDelayed(() -> mRibonScrollView.fullScroll(View.FOCUS_RIGHT), 17);

当一个项目被点击时,它右边的所有项目都应该被删除。

我已尝试使用 removeViewsInLayout 方法执行此操作,以及反复删除最终视图。

(忽略缺少边界检查)

    view.setOnClickListener(v -> {
        mRibbon.removeViewsInLayout(mRibbon.indexOfChild(view) + 1, mRibbon.getChildCount());
    });


    view.setOnClickListener((v) -> {
        final int index = mRibbon.indexOfChild(view);
        for(int i = 0; i < index; i++) mRibbon.removeViewAt(mRibbon.getChildCount());
    });

这两种方法都给出相同的异常

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.unFocus(android.view.View)' on a null object reference
                                                                      at android.view.ViewGroup.removeViewsInternal(ViewGroup.java:4691)
                                                                      at android.view.ViewGroup.removeViewsInLayout(ViewGroup.java:4539)
                                                                      at com.tpb.projects.repo.content.ContentActivity.lambda$-com_tpb_projects_repo_content_ContentActivity_lambda$1(ContentActivity.java:67)

感谢任何帮助。

编辑:

删除并重新添加视图确实有效,但我认为这不是一个好的解决方案。

    view.setOnClickListener(v -> {
        final ArrayList<View> views = new ArrayList<>();
        for(int i = 0; i <= mRibbon.indexOfChild(view); i++) {
            views.add(mRibbon.getChildAt(i));
        }
        mRibbon.removeAllViews();
        for(View item : views) {
            mRibbon.addView(item);
        }

    });

【问题讨论】:

    标签: java android android-layout nullpointerexception


    【解决方案1】:

    试试这个:
    1. 使用子元素获取对父元素的引用。
    2. 将父级转换为 ViewGroup,以便您可以访问 removeView 方法并使用它。

    ((ViewGroup)scrollChildLayout.getParent()).removeView(scrollChildLayout);
    

    不是这样的:

    //scrollView.removeView(scrollChildLayout);
    

    【讨论】:

    • 这让我可以删除被点击的视图,但是当我试图从 ViewGroup 中删除一系列视图时,我会遇到同样的崩溃,这是我需要做的。
    • 在remove之前调用requestChildFocus怎么样?
    • 那也会崩溃,因为 ViewGroup 为 getFocusedChild() 返回 null,这是 requestChildFocus 所必需的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2015-08-15
    • 1970-01-01
    • 2015-02-19
    相关资源
    最近更新 更多