2017-03-13 59 views
2

我已經編程添加CheckedTextView到linearlayout視圖。請看下面的代碼:Android CheckedTextView如何更新視圖

private LinearLayout linearLayout; 
private CheckedTextView checkedtextview; 
    linearLayout = (LinearLayout) findViewById(R.id.statusView); 
    checkedtextview = new CheckedTextView(ScanStatus.this, null, android.R.attr.listChoiceIndicatorMultiple); 
    checkedtextview.setText(R.string.applications); 
    linearLayout.addView(checkedtextview); 

代碼後來我不得不更新checkedtextview象下面這樣:

checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1)); 
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN); 
linearLayout.addView(checkedtextview); 

但這會導致崩潰與以下日誌:

d/AndroidRuntime(24818 ):關閉VM E/AndroidRuntime(24818):致命異常:主要 E/AndroidRuntime(24818):進程:com.example.ashwini.timapp,PID:24818 E/AndroidRuntime(24818):java.lang。 IllegalStateE xception:指定的孩子已經擁有父母。您必須先調用子對象的父對象的removeView()。

請問我該如何更新視圖?

回答

1

你有兩種選擇。從@堅持遠方答案

checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1)); 
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN);. 

在第二種情況下使用提示:

linearLayout.removeView(checkedtextview); 
checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1)); 
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN); 
linearLayout.addView(checkedtextview); 
+0

讓我知道如果第一個變體不起作用。也許你還需要調用'checkedtextview.invalidate()' –

+0

我是初學者到android。如何引用checkedtextview?你能解釋一下代碼片段嗎? – ashkus

+1

你已經擁有它了,因爲我看到了。這是你的班級裏的私人變量。一旦你在開始創建它 - 你有一個參考,並不需要每次更新時重新創建它。您可以在運行時在類中更改此視圖的屬性,也可以調用'invalidate()'方法在屏幕上重繪它 –

2

我認爲首先你需要刪除視圖,然後更新它。

linearLayout.removeView(checkedtextview); 
checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1)); 
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN); 
linearLayout.addView(checkedtextview); 
+0

This Works。但是,我可以更新而不刪除視圖? – ashkus

1

似乎您試圖添加兩次checkedtextview

要更改檢查狀態,你可以從linearLayout認爲像下面

無論linearLayout.getChildAt(position) 或 保持在類中的checkedtextview參考,並更改狀態,只要你想。

+0

我是新來的android,你能解釋一下代碼嗎? – ashkus

0

你可以 - 首先,如果你有一個關於你checkedtextview所有的時間,你可以無需調用addView更新把檢查

if (checkedtextview.getParent() == null) { 
     // thn add your childview 
    } else { 
     linearLayout.removeAllViews(); 
     //add your child view herer 
    } 

,或者如果你不想從父刪除所有子THN你可以試試這個:

if (checkedtextview.getParent() != null) 
     ((ViewGroup)checkedtextview.getParent()).removeView(checkedtextview); 
    linearLayout.addView(checkedtextview); 
+0

不起作用。這將從此佈局中移除所有視圖。而且空檢查是不正確的,如果父母爲空,你不能添加視圖,那麼會有NPE。 –

+0

if(checkedtextview.getParent()!= null) ((ViewGroup)checkedtextview.getParent())。removeView(checkedtextview); linearLayout.addView(checkedtextview); –