【问题标题】:remove a chart from it's parent从其父图表中删除图表
【发布时间】:2023-03-26 00:19:01
【问题描述】:

我想在 android 中绘制一个图表,为此我正在使用一个图表(我将一个 jar 文件导入我的应用程序),我将需要显示的值传递给该图表...

这个图表的问题是它在设置的activity中占据了全屏。

public void onCreate(){

LineView lv;

lv=new LineView(this);

}

我放在图表上的值是使用异步线程从数据库中读取的,所以我在哪里这样做:

protected void onProgressUpdate(String...values) {


setContentView(lv);

}

一遍又一遍地处理整个数据。

这是我的问题:

我尝试使用一个 xml 文件,其中我有一个空白的线性布局和一个按钮(我想在我的图表下方设置一个按钮),并且我试图将我的图表 lv 作为一个孩子传递给那个没有的线性布局占据我的整个屏幕:


xml 文件:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent">



<LinearLayout


    android:id="@+id/titlu"

    android:orientation="horizontal"

    android:layout_width="fill_parent"

    android:layout_height="250px" >


/>

</LinearLayout>

  <Button

 android:layout_width="wrap_content"

 android:layout_height="wrap_content"

 android:text="Stop"

 android:gravity="bottom"

 android:id="@+id/stop"  

 />

当我尝试 在 onCreate 中:

thatlinear=(LinearLayout)findViewById(R.id.titlu);

还有这个:

thatlinear.addView(lv);  in my function onProgresssUpdate()

我收到一个错误,告诉我我的图表 lv 已经有一个父级,为了将它传递给其他父级,我必须删除初始父级。

所以...我这样做了:

ViewGroup v=(ViewGroup)(lv.getParent());

         v.removeView(lv);

但是猜猜它没有这样工作......我在这一行遇到了 FC-java lang 空指针异常:

v.removeView(lv);

我尝试的最后一个是:

  LinearLayout llay=new LinearLayout(this);

      LinearLayout lytContainer = (LinearLayout) View.inflate(
              this, R.layout.chart_speed, null);



      lytContainer.setLayoutParams(new LinearLayout.LayoutParams(

                          LinearLayout.LayoutParams.FILL_PARENT,

                          LinearLayout.LayoutParams.WRAP_CONTENT));


      llay.addView(lv);

chart_speed 是我上面贴的xml...

而且它也不是这样工作的......仍然是 FC。

问题:

如何继续将我的图表作为一个孩子传递给线性布局,这样它就不会填满我的整个屏幕......我可以在它下面放置按钮???

编辑:

我已经这样做了:

setContentView(R.layout.chart_speed);

ViewGroup thatlayout=(ViewGroup)findViewById(R.id.titlu);

thatlayout.addView(lv);

chart_speed-是我整个xml的名字 titlu 是我的 LinearLayout 的@+id...

这就是我的 logcat 显示的内容:

 java.lang.NullPointerException
     at com.kidroid.kichart.view.AxisView.GenerateValue(AxisView.java:112)

at com.kidroid.kichart.view.AxisView.drawAxisXY(AxisView.java:61)

at com.kidroid.kichart.view.LineView.onDraw(LineView.java:19)

at android.view.View.draw(View.java:6535)

 at android.view.ViewGroup.drawChild(ViewGroup.java:1531)

  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)

0  at android.view.ViewGroup.drawChild(ViewGroup.java:1529)

    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)

    at android.view.ViewGroup.drawChild(ViewGroup.java:1529)

 at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)

  at android.view.View.draw(View.java:6538)

EDIT2:

我已在我的 ProgressUpdate() 中完成此操作{

//初始化组件

thatlayoyt.add(lv);

}

几秒钟后它显示正确,但在那之后我得到了 FC:

java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()。

at android.view.ViewGroup.addViewInner(ViewGroup.java:1861)

at android.view.ViewGroup.addView(ViewGroup.java:1756)

在 android.view.ViewGroup.addView(ViewGroup.java:1713)


最终版本,它可以工作...我认为不是很正确,但它可以工作:

ViewGroup 那个布局;

public void onCreate(Bundle savedInstanceState) {

thatlayout=(ViewGroup)findViewById(R.id.titlu);

}

protected void onProgressUpdate(String...values) {

//正在初始化

try{
         ViewGroup v=(ViewGroup)(lv.getParent());
         v.removeView(lv);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }


        thatlayout.addView(lv);

}


【问题讨论】:

    标签: android view android-layout


    【解决方案1】:

    我相信麻烦就在这里:

    protected void onProgressUpdate(String...values) {
    
        setContentView(lv); //HERE
    
    }
    

    您只需在onCreate 中致电setContentView 一次。之后,您可以实例化一个LineView(我想这是图表)并将其添加到主布局中。

    // in onCreate   
    setContentView(R.layout.main);
    LineView lv = new LineView();
    ViewGroup main = (ViewGroup)findViewById(R.id.main);
    main.addView(lv);
    

    我假设您的主布局在 main.xml 中定义,而根布局有 android:id="@+id/main

    【讨论】:

    • 自定义组件好像有问题。在展示它之前,你必须做一些初始化它的工作。请参阅this linkthis one
    • =))) ....在罗马尼亚语中:din primul link mi am luat componenta...iar al doilea e o intrebare postata tot de mine...这些都没有帮助:)
    • 我在初始化之后尝试了这个(在 ProgressUpdate()...) thatlayoyt.add(lv); ViewGroup v=(ViewGroup)(lv.getParent()); v.removeView(lv);
    • 你误会了。 NullPointerException 是由LineView 引起的,因为您没有调用lv.setItems()(当然,使用正确初始化的Aitems 数组)。您最近的布局修改是不必要的,会导致更多错误。
    • Exactlyyy...lv.setItems() 和其他初始化的事情我在 onProgressUpdate() 中执行...所以我这样做...然后我执行 thatlayout.add(lv) ;....然后它运行良好一秒钟然后崩溃....:)
    猜你喜欢
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2013-12-29
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多