从其父级中删除图表

时间:2011-06-03 10:44:21

标签: android view android-layout

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

此图表的问题在于它占据了设置的活动的全屏。

public void onCreate(){

LineView lv;

lv=new LineView(this);

}

我在图表上放置的值是使用异步线程从DB中获取的,所以我这样做:

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"  

 />

当我尝试的时候 in 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。

问题:

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

编辑:

我做到了这一点:

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 thatlayout;

public void onCreate(Bundle savedInstanceState){

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

}

protected void onProgressUpdate(String ... values){

// initalizating

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


        thatlayout.addView(lv);

}


1 个答案:

答案 0 :(得分:0)

我相信麻烦就在这里:

protected void onProgressUpdate(String...values) {

    setContentView(lv); //HERE

}

您只需在setContentView中拨打onCreate一次。之后,您可以实例化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