中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android中動態添加一個view

發布時間:2021-02-19 15:49:37 來源:億速云 閱讀:151 作者:Leah 欄目:移動開發

如何在Android中動態添加一個view?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

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

  <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

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

    <Button
      android:id="@+id/btn_getData"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@+id/ll_addView"
      android:layout_marginTop="10dp"
      android:background="@drawable/em_btn_green_selector"
      android:text="獲取數據" />
  </RelativeLayout>
</ScrollView>

再看看要添加的item_hotel_evaluate里面的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/rl_hotelName"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@drawable/editbox_background_normal">

  <LinearLayout
    android:id="@+id/rl_addHotel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
      android:id="@+id/tv_hotelName"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginLeft="5dp"
      android:layout_weight="1"
      android:text="酒店名稱:"
      android:textSize="18sp" />

    <EditText
      android:id="@+id/ed_hotelName"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="2"
      android:background="@drawable/editbox_background_normal"
      android:padding="5dp"
      android:singleLine="true" />

    <Button
      android:id="@+id/btn_addHotel"
      android:layout_width="0dp"
      android:layout_height="30dp"
      android:layout_weight="1"
      android:background="@drawable/em_btn_green_selector"
      android:text="+新增"
      android:textColor="@color/white"
      android:textSize="18sp" />
  </LinearLayout>

  <LinearLayout
    android:id="@+id/ll_addHotelEvaluate"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/rl_addHotel"
    android:layout_marginTop="5dp"
    android:orientation="vertical">

    <RelativeLayout
      android:id="@+id/rl_hotelEvaluate"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@+id/rl_addHotel"
      android:layout_marginTop="5dp"
      android:orientation="horizontal">

      <TextView
        android:id="@+id/tv_hotelServer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="5dp"
        android:layout_weight="1"
        android:text="服務評價:"
        android:textSize="18sp" />

      <RatingBar
        android:id="@+id/rb_hotel_evaluate"
        
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:layout_toRightOf="@+id/tv_hotelServer"
        android:numStars="5"
        android:rating="0"
        android:stepSize="1.0" />
    </RelativeLayout>

    <EditText
      android:id="@+id/ed_hotelEvaluate"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@+id/rl_server"
      android:background="@drawable/editbox_background_normal"
      android:singleLine="true" />
  </LinearLayout>
</RelativeLayout>

布局好了,因為Activity里面的代碼寫不是很多,直接上代碼了,然后在最后分析一下:

package com.bob.lucking.activity;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RatingBar;

import com.bob.lucking.R;

/**
 * Created by bob on 2017/3/20.
 */

public class DynamicAddViewActivity extends Activity implements View.OnClickListener {

  private String TAG = this.getClass().getSimpleName();
  //裝在所有動態添加的Item的LinearLayout容器
  private LinearLayout addHotelNameView;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dynamic);
    addHotelNameView = (LinearLayout) findViewById(R.id.ll_addView);
    findViewById(R.id.btn_getData).setOnClickListener(this);

    //默認添加一個Item
    addViewItem(null);
  }

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.btn_addHotel://點擊添加按鈕就動態添加Item
        addViewItem(v);
        break;
      case R.id.btn_getData://打印數據
        printData();
        break;
    }
  }

  /**
   * Item排序
   */
  private void sortHotelViewItem() {
    //獲取LinearLayout里面所有的view
    for (int i = 0; i < addHotelNameView.getChildCount(); i++) {
      final View childAt = addHotelNameView.getChildAt(i);
      final Button btn_remove = (Button) childAt.findViewById(R.id.btn_addHotel);
      btn_remove.setText("刪除");
      btn_remove.setTag("remove");//設置刪除標記
      btn_remove.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        //從LinearLayout容器中刪除當前點擊到的ViewItem
         addHotelNameView.removeView(childAt);
        }
      });
      //如果是最后一個ViewItem,就設置為添加
      if (i == (addHotelNameView.getChildCount() - 1)) {
        Button btn_add = (Button) childAt.findViewById(R.id.btn_addHotel);
        btn_add.setText("+新增");
        btn_add.setTag("add");
        btn_add.setOnClickListener(this);
      }
    }
  }

  //添加ViewItem
  private void addViewItem(View view) {
    if (addHotelNameView.getChildCount() == 0) {//如果一個都沒有,就添加一個
      View hotelEvaluateView = View.inflate(this, R.layout.item_hotel_evaluate, null);
      Button btn_add = (Button) hotelEvaluateView.findViewById(R.id.btn_addHotel);
      btn_add.setText("+新增");
      btn_add.setTag("add");
      btn_add.setOnClickListener(this);
      addHotelNameView.addView(hotelEvaluateView);
      //sortHotelViewItem();
    } else if (((String) view.getTag()).equals("add")) {//如果有一個以上的Item,點擊為添加的Item則添加
      View hotelEvaluateView = View.inflate(this, R.layout.item_hotel_evaluate, null);
      addHotelNameView.addView(hotelEvaluateView);
      sortHotelViewItem();
    } 
    //else {
     // sortHotelViewItem();
    //}
  }

  //獲取所有動態添加的Item,找到控件的id,獲取數據
  private void printData() {
    for (int i = 0; i < addHotelNameView.getChildCount(); i++) {
      View childAt = addHotelNameView.getChildAt(i);
      EditText hotelName = (EditText) childAt.findViewById(R.id.ed_hotelName);
      RatingBar hotelEvaluateStart = (RatingBar) childAt.findViewById(R.id.rb_hotel_evaluate);
      EditText hotelEvaluate = (EditText) childAt.findViewById(R.id.ed_hotelEvaluate);
      Log.e(TAG, "酒店名稱:" + hotelName.getText().toString() + "-----評價星數:"
          + (int) hotelEvaluateStart.getRating() + "-----服務評價:" + hotelEvaluate.getText().toString());
    }
  }
}

最后我們來解讀一下代碼:

onCreate里面初始化控件并設置事件,同時我們默認添加一條item,因為addHotelNameView容器初始化時里面沒有子view,所以我們默認給添加的方法傳null,

在addViewItem方法時,里面有初始化并設置button方法,所以在onclick方法里面把事件的v傳入是為了做標記,也就是設置tag,,在添加時會有兩種情況:

1.如果只有一條,我們只能顯示添加

2.有多條的情況下,如果點擊的是設置有tag為add標記的添加,則添加

如果點擊刪除,在sortHotelViewItem方法里面已經設置過刪除點擊事件,直接從內存中刪除,

最后是獲取數據,我們可以通過LinearLayout容器來遍歷addHotelNameView.getChildCount()獲取所有添加的item,然后找到控件的id去獲取所有添加的item數據。

再這里注釋一下:在addViewItem方法里面看到可以優化,上傳資源時已經打包好了,現在在這里用單行注釋掉了4行,添加第一個item時不需要排序的,還有就是else里面的是死代碼,下載資源的朋友些可以刪除這幾行。

關于如何在Android中動態添加一個view問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奎屯市| 多伦县| 上饶县| 剑河县| 汉源县| 界首市| 垫江县| 淮南市| 乡城县| 锡林浩特市| 宾川县| 穆棱市| 安溪县| 平阳县| 靖安县| 枣阳市| 盈江县| 湛江市| 静安区| 扬州市| 阳原县| 旅游| 定结县| 尉犁县| 中江县| 漳平市| 南昌县| 东丽区| 轮台县| 九江县| 邮箱| 荥阳市| 洛南县| 政和县| 白水县| 青州市| 华蓥市| 陇西县| 太和县| 固始县| 万载县|