【问题标题】:dynamically include a layout to another layout file inside a fragment动态地将布局包含到片段内的另一个布局文件中
【发布时间】:2017-12-04 06:46:15
【问题描述】:

我有一个片段布局,我想动态添加另一个子布局,

我试过这个https://stackoverflow.com/a/22592269/8476022

子布局xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="20dp"
    android:hint="Question"
    android:textColor="@color/colorTextBlack"
    android:textSize="16dp" />
</android.support.constraint.ConstraintLayout>

这是我的主要布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f2f2f2"
android:orientation="vertical">
<FrameLayout
    android:id="@+id/flContainer"
    android:layout_width="match_parent"
    android:layout_margin="20dp"
    android:layout_height="wrap_content"/>
</LinearLayout>

在我的片段中,我包含了子布局

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_start_question, container, false);
     flContainer = (FrameLayout) v.findViewById(R.id.flContainer);
     flContainer.addView(R.layout.sub_layout);
    return v;
}

但我在 addView 附近遇到错误,屏幕截图如下

谁能帮忙找出错误

【问题讨论】:

    标签: android android-layout android-fragments include fragment


    【解决方案1】:

    您收到错误是因为 addView(View child) 需要参数 view 并且您正在添加 FrameLayoutViewGroup

    试试这个方法

    LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View myView = inflater.inflate(R.layout.sub_layout, null);;
    flContainer = (FrameLayout) v.findViewById(R.id.flContainer);
    flContainer.addView(myView);
    

    【讨论】:

      【解决方案2】:

      添加视图需要 View 对象。您正在传递布局 ID。

      addView(查看视图)

      你没有传递布局ID

      flContainer.addView(R.layout.sub_layout);// 错误

      首先使用 inflater 为视图充气,然后将其添加到容器中。

       View view=LayoutInflater.from(getContext()).inflate(R.layout.yourView,null);
        yourContainer.addView(view);
      

      【讨论】:

        【解决方案3】:

        你需要膨胀布局来添加视图参考this

        View child = getLayoutInflater().inflate(R.layout.sub_layout, null);
        flContainer = (FrameLayout) v.findViewById(R.id.flContainer);
        flContainer.addView(child);
        

        【讨论】:

          【解决方案4】:

          你想使用:

          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                               Bundle savedInstanceState) {
              // Inflate the layout for this fragment
                  View v = inflater.inflate(R.layout.fragment_start_question, container, false);
              // flContainer = (FrameLayout) v.findViewById(R.id.flContainer);
                  // flContainer.addView(R.layout.sub_layout);
              LinearLayout linPhoneNumber = (LinearLayout) v.findViewById(R.id.linPhoneNumber);
              View viewPhoneNumber  =  getActivity().getLayoutInflater().inflate(R.layout.fragment_contact_phone, null);
              LinearLayout linPhoneLayout = (LinearLayout) viewPhoneNumber.findViewById(R.id.linPhoneLayout);
              TextView txtPhoneNumber = (TextView) viewPhoneNumber.findViewById(R.id.txtPhoneNumber);
              txtPhoneNumber.setText(phone);
              linPhoneNumber.addView(viewPhoneNumber);
              return v;
          }
          

          在 fragment_start_question.xml 中放置一个线性布局:

          <LinearLayout
              android:id="@+id/linPhoneNumber"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:orientation="vertical"></LinearLayout>
          

          然后是fragment_contact_phone.xml

          <LinearLayout
              android:id="@+id/linPhoneLayout"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_marginLeft="@dimen/margin_top_10"
              android:orientation="horizontal"
              android:padding="@dimen/margin_top">
          
              <ImageView
                  android:id="@+id/imgCall"
                  android:layout_width="30dp"
                  android:layout_height="30dp"
                  android:layout_gravity="center_vertical"
                  android:src="@drawable/icon_call" />
          
              <Textview
                  android:id="@+id/txtPhoneNumber"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_gravity="center_vertical"
                  android:layout_marginLeft="@dimen/margin_top_1"
                  android:textColor="@color/menu_text_color"
                  android:textSize="@dimen/margin_top_1"/>
          </LinearLayout>
          

          【讨论】:

            【解决方案5】:

            将您的 onCreateView 替换为以下内容,

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                // Inflate the layout for this fragment
                View v = inflater.inflate(R.layout.fragment_start_question, container, false);
                flContainer = (FrameLayout) v.findViewById(R.id.flContainer);
                View subView = inflater.inflate(R.layout.sub_layout, null);
                flContainer.addView(subView);
                return v;
            }
            

            【讨论】:

              【解决方案6】:

              您只传递布局 id,首先定义一个布局,例如:

              LinearLayout sublayout = (LinearLayout)v.findViewBYId(R.layout.sub_layout)
              flContainer.addView(sublayout);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多