Java 应用程序在linearLayout removeAllViews中关闭:Android

Java 应用程序在linearLayout removeAllViews中关闭:Android,java,android,android-fragments,dynamic-view,Java,Android,Android Fragments,Dynamic View,我是android开发新手。我将代码从MainActivity转移到片段类。在我的onCreateView方法中,我调用viewFunds()方法来动态显示来自SQLite的数据 但是,当我单击该片段的选项卡时,应用程序在到达removeAllViews行时关闭。每次调用此方法刷新数据时,我都需要首先移除AllView 因为我也在其他方法中调用ViewFunds(),例如在删除数据时,所以我调用它来刷新屏幕上的结果 见下面的代码: public View onCreateView(LayoutI

我是android开发新手。我将代码从MainActivity转移到片段类。在我的onCreateView方法中,我调用viewFunds()方法来动态显示来自SQLite的数据

但是,当我单击该片段的选项卡时,应用程序在到达removeAllViews行时关闭。每次调用此方法刷新数据时,我都需要首先移除AllView

因为我也在其他方法中调用ViewFunds(),例如在删除数据时,所以我调用它来刷新屏幕上的结果

见下面的代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootview = inflater.inflate(R.layout.activity_settings_tab, container, false);
        super.onCreate(savedInstanceState);
        myDb = new DatabaseHelper(getContext());


        btnAddData = (Button) rootview.findViewById(R.id.button_add);
        btnviewAll = (Button) rootview.findViewById(R.id.button_viewAll);
        btnAddFund = (Button) rootview.findViewById(R.id.button_AddFund);
        btnviewUpdate = (Button) rootview.findViewById(R.id.button_update);
        editEmergencyFund = (EditText) rootview.findViewById(R.id.edit_EmergencyFund);
        editProsperityFund = (EditText) rootview.findViewById(R.id.edit_ProsperityFund);
        editRewardFund = (EditText) rootview.findViewById(R.id.edit_RewardFund);

        viewAll(); //this is for a button
        viewFunds();//this is executed when the fragment is called


        return inflater.inflate(R.layout.activity_settings_tab, container, false);
    }


public void viewFunds() { 
        Cursor res2 = myDb.getConfigData();
        res2.moveToFirst();


        final View linearLayout = getActivity().findViewById(R.id.ll_config);
        ((LinearLayout) linearLayout.getParent()).removeAllViews(); //clear layout first - LINE WITH ISSUE
        ((LinearLayout) linearLayout.getParent()).setGravity(Gravity.CENTER);

 //some code follows...

 }
这组代码中在removeAllViews行之后编写的最后一行也会导致应用程序关闭:

 LinearLayout llh = new LinearLayout(getActivity());
            llh.setOrientation(LinearLayout.HORIZONTAL);
            LinearLayout.LayoutParams lp_llh = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            llh.setLayoutParams(lp_llh);

            ((LinearLayout) linearLayout.getParent()).addView(llh); //code  that causes app to close
提前感谢您的帮助。

我假设
((LinearLayout)LinearLayout.getParent()).removeAllViews()
也会删除
LinearLayout
。尝试这样做:

...
ViewParent parent = linearLayout.getParent();
parent.removeAllViews();
parent.setGravity(Gravity.CENTER);
...
parent.addView(llh);
...

在这里,您将返回刚刚在
onCreateView
末尾创建的新
视图

return inflater.inflate(R.layout.activity_settings_tab, container, false);
由于您返回了新的
视图
视图
,您发现其中有一个有效的引用,这将导致NPE。将其更改为:

return rootView;

仅应删除linearlayout(文本视图、编辑文本)下的动态对象。linearlayout指的是静态创建的linearlayout。当我尝试上述建议时,parent.removeAllViews用红色下划线。原因可能是什么?那么您应该调用
linearLayout.removeAllViews()
,因为它只删除子视图,而不是原始视图。我将行更改为:((linearLayout)linearLayout.removeAllViews();但是当到达这条线时,应用程序仍然会崩溃。你是说像这样还是我弄错了?返回充气器。充气(rootView,容器,假);。我尝试时,此行中的“rootView”标记为红色。谢谢,我只是喜欢上面提到的用returnrootview替换整个行;首先膨胀rootview,然后在其中定义视图,最后将其作为片段视图返回。。这就是为什么您应该在方法末尾返回rootView的原因。谢谢。一个新手问题:如何在rootView中以编程方式定义视图?另一个问题:在你的答案的最后一段,你能给出一个示例代码吗?这样我就能理解“在活动中定义一个公共方法,并通过从片段中调用该方法来编辑活动视图”是什么意思了。谢谢。很抱歉,最后一部分,我把getParent()和getActivity()弄错了您无需在活动中定义公共方法。。顺便说一句,removeAllViews问题解决了吗?没有:(.我将代码更改为((LinearLayout)LinearLayout)。removeAllViews();但是当它到达这一行时,应用程序仍在崩溃。我是否在片段中错误地使用了public void viewFunds()?