2011-08-12 20 views
0

xmlを使用して複合コントロールを作成し、他のxml レイアウトに配置して再利用できるようになりました。しかし、私はJavaコードを使用して実行時に追加したい。私は、次のコードを試してみましたが... 実行時に複合コントロールをレイアウトに追加するにはどうすればよいですか?

は、私は任意のヘルプや提案をいただければ幸いですので、Androidに新しい静かだ...

COMPOUND唯一のTextViewが表示され、化合物-制御が示されていない - コントロールレイアウト

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/border_lines" 

> 
    <TextView android:id="@+id/msg_title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="SAMPLE MESSAGE TITLE" 
    /> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
    > 
     <Button android:id="@+id/btn_shw" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:text="SHOW MSG" 
      android:layout_weight="1" 
     /> 
     <Button android:id="@+id/btn_dis" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:text=" DISABLE" 
      android:layout_weight="1" 
     /> 
     <Button android:id="@+id/btn_del" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:text=" DELETE " 
      android:layout_weight="1" 
     /> 
    </LinearLayout>  
</LinearLayout> 

COMPOUND-CONTROLのCODE

public class RemainderControl extends LinearLayout 
{ 
    Button btn1,btn2,btn3; 
    TextView tv1; 
    public RemainderControl(Context context) 
    { 
     super(context); 
      LayoutInflater inflater=LayoutInflater.from(context); 
     inflater.inflate(R.layout.remainder_control,this); 

     loadviews(); 
    } 

    public RemainderControl(Context context,AttributeSet attrs) 
    { 
     super(context,attrs); 

     LayoutInflater inflater=LayoutInflater.from(context); 
     inflater.inflate(R.layout.remainder_control,this); 

     loadviews(); 


    } 

    private void loadviews() 
    { 
     btn1=(Button)findViewById(R.id.btn_shw); 
     btn2=(Button)findViewById(R.id.btn_dis); 
     btn3=(Button)findViewById(R.id.btn_del); 
     tv1=(TextView)findViewById(R.id.msg_title); 
      btn1.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       tv1.setText("SHOW BUTTON PRESSED");  
      } 
     }); 
     btn2.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       tv1.setText("DISABLE BUTTON PRESSED");  
      } 
     }); 
     btn3.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       tv1.setText("DELETE BUTTON PRESSED"); 
      } 
     }); 
     tv1.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       tv1.setText(""); 
      } 
     }); 
    } 
} 

CODEはあなたのコントロールがXMLに含まれている

public class RemainderList extends Activity 
{ 
    ScrollView sv1; 
    LinearLayout ll1; 
    deepak.android.remainder.RemainderControl rc1; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     int ht=LayoutParams.WRAP_CONTENT; 
     int wt=LayoutParams.FILL_PARENT; 

     sv1=new ScrollView(this); 
     ll1=new LinearLayout(this); 
     ll1.setOrientation(LinearLayout.VERTICAL); 
     sv1.addView(ll1); 

     TextView tv1=new TextView(this); 
     tv1.setText("THIS IS SAMPLE TEXT"); 
     ll1.addView(tv1,new LinearLayout.LayoutParams(wt,ht)); 

     rc1=new deepak.android.remainder.RemainderControl(this); 
     ll1.addView(rc1,new LinearLayout.LayoutParams(wt,ht)); 

     setContentView(sv1); 
    } 
} 

答えて

3

は、public RemainderControl(Context context,AttributeSet attrs)コンストラクタが呼び出されたコントロールを追加します。しかし、あなたのコードでは、直接コンストラクタpublic RemainderControl(Context context)を呼び出します。レイアウトを膨張させるコードをすべて移動し、リスナーを何らかの方法(たとえばinit())に設定し、両方のコンストラクタでそれを呼び出します。

+0

「LayoutInflater ...」コードを別のメソッドに配置すると、「コンテキスト」がメソッド内で表示されないため、エラーが表示されます。だから私は両方のコンストラクタにコードを複製し、今は正常に動作します。しかし、私は何か間違っている。私はduplication.iでそれを動作させることができなければなりません。上記のコードを変更して、今すぐ動作させるようにしてください。 – Deepak

+0

もちろん、複製なしでも可能です。コンテキストを 'init'メソッドのパラメータとして渡すだけです。 'private void init(コンテキストコンテキスト){//それを行う}'のようなものと 'init(context);'のようなコンストラクタで呼び出す – ernazm

+0

私はそれをたくさんありがとう – Deepak