2012-05-14 98 views
0

對不起,如果我問一個愚蠢的問題,但到目前爲止還沒有運氣來解決這個問題。我有2個單選按鈕來決定佈局,並使用佈局波紋管組件。這裏是佈局無線電選擇動態子佈局

<?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"> 
    <TextView 
      android:id="@+id/arrival_date_label" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/arrival_date_label"/> 
    <EditText 
      android:id="@+id/arrival_date" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/arrival_date_label" 
      android:hint="10/05/2012"/> 
    <Spinner 
      android:id="@+id/arrival_time_spinner" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/arrival_date"/> 
    <TextView 
      android:id="@+id/return_date_label" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/return_date_label" 
      android:layout_below="@id/arrival_time_spinner"/> 
    <EditText 
      android:id="@+id/return_date" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/return_date_label" 
      android:hint="10/05/2012"/> 
    <Spinner 
      android:id="@+id/return_time_spinner" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/return_date"/> 
</RelativeLayout> 

和Java類初始化一些使用


public class ReturnFixedDays extends RelativeLayout { 
    private EditText arrivalDate; 
    private Spinner arrivalTime; 
    private EditText returnDate; 
    private Spinner returnTime; 
    private final String pattern = "dd/MM/yyyy"; 

    public ReturnFixedDays(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     LayoutInflater inflater = LayoutInflater.from(context); 
     View view = inflater.inflate(R.layout.return_fixed_days, null); 

     arrivalDate = (EditText) view.findViewById(R.id.arrival_date); 
     arrivalDate.setText(arrivalDate()); 

     arrivalTime = (Spinner) view.findViewById(R.id.arrival_time_spinner); 
     ArrayAdapter adapter = new ArrayAdapter(context, R.array.travel_time_entries,android.R.layout.simple_spinner_item); 
     arrivalTime.setAdapter(adapter); 

     returnDate = (EditText) view.findViewById(R.id.return_date); 
     returnDate.setText(returnDate()); 

     returnTime = (Spinner) view.findViewById(R.id.return_time_spinner); 
     ArrayAdapter adapter2 = new ArrayAdapter(context, R.array.travel_time_entries,android.R.layout.simple_spinner_item); 
     returnTime.setAdapter(adapter2); 
    } 

    private String arrivalDate(){ 
     return dateToString(today()); 
    } 

    private String returnDate(){ 
     return dateToString(weekLater()); 
    } 

    private String dateToString(Date date){ 
     return formatter().format(date); 
    } 

    private SimpleDateFormat formatter(){ 
     return new SimpleDateFormat(pattern); 
    } 

    private Date weekLater(){ 
     return adjustDateBy(today(), 7); 
    } 

    private Date today(){ 
     return Calendar.getInstance().getTime(); 
    } 

    private Date adjustDateBy(Date currentDate, int numOfDays) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(currentDate); 
     calendar.add(Calendar.DATE, numOfDays); 

     return calendar.getTime(); 

    } 

} 

我們添加到此佈局的組成部分,查看我一樣在XML

<RelativeLayout 
      android:id="@+id/dates_layout" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/flight_layout"> 
     <TextView 
       android:id="@+id/date_label" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:text="@string/dates_label" 
       style="@style/Label"/> 
     <RadioGroup 
       android:id="@+id/dates_radio_group" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:layout_below="@id/date_label"> 
      <RadioButton 
        android:id="@+id/flexible_dates_radio" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/flexible_dates_label" 
        style="@style/Label"/> 
      <RadioButton 
        android:id="@+id/fixed_dates_radio" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:checked="true" 
        android:text="@string/fixed_dates_label" 
        style="@style/Label"/> 
     </RadioGroup> 
    </RelativeLayout> 
    <RelativeLayout 
      android:id="@+id/stub_container" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/dates_layout"> 

     <com.flyweekend.android.date.view.ReturnFixedDays 
       android:id="@+id/return_fixed_days_stub" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout="@layout/return_fixed_days"/> 

     <com.flyweekend.android.date.view.ReturnFlexibleDays 
       android:id="@+id/return_flexible_days_stub" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout="@layout/return_flexible_days"/> 
    </RelativeLayout> 

下列之一FlightView.java


@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     context = getActivity(); 
     dateTypeRadioGrp = dateTypeRadioGroup(view); 
     returnFixedDays = (RelativeLayout) view.findViewById(R.id.return_fixed_days_stub); 
     updateDatesVisibility(); 
     return view; 
    } 

private RadioGroup dateTypeRadioGroup(View view){ 
     RadioGroup group = (RadioGroup)view.findViewById(R.id.dates_radio_group); 
     group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
      public void onCheckedChanged(RadioGroup radioGroup, int selected) { 
       if(selected == R.id.flexible_dates_radio){ 
        Log.i(TAG, "Flexible dates selected"); 
        updateDatesVisibility(); 
       }else{ 
        Log.i(TAG, "Fixed dates selected"); 
        updateDatesVisibility(); 
       } 
      } 
     }); 
     return group; 
    } 

    private void updateDatesVisibility(){ 
     if(dateTypeRadioGrp.getCheckedRadioButtonId() == R.id.fixed_dates_radio){ 
      returnFixedDays.setVisibility(View.VISIBLE); 
     } else{ 
      returnFixedDays.setVisibility(View.INVISIBLE); 
     } 
    } 

但是這兩組都不可見。我想我需要額外的眼睛來發現我要錯誤地動態添加這些佈局。

回答

1

有了這個:

View view = inflater.inflate(R.layout.return_fixed_days, null); 
你剛剛膨脹的佈局文件

,你實際上並沒有它連接到您的自定義視圖ReturnFixedDays。要附加充氣佈局自定義視圖你必須通過this作爲第二個參數(代表新充氣視圖層次的父):

View view = inflater.inflate(R.layout.return_fixed_days, this); 

有可能是錯誤的代碼中的其他事情,所以檢查和看看這是否能解決你的問題。

+0

是的,就是這樣! Well spotted :-) –

+0

@peter_budo此外,如果'R.layout.return_fixed_days'是您發佈的xml佈局(使用根'RelativeLayout'),您可能希望移除該父親'RelativeLayout'並將其替換與一個'merge'標籤。現在,您正在'ReturnFixedDays'(它擴展了** RelativeLayout **)和'R.layout.return_fixed_days'中的視圖之間添加額外的'RelativeLayout'。 – Luksprog

+0

是的,這是下一步,我只需要它開始,然後我可以做一些代碼清理;) –