TCID50计算器5.0
采用Android Studio编写的TCID50计算软件,可在各安卓平台运行,采用Reed-Muench两氏法,可用于计算TCID50,EID50等。分享给大家,有问题欢迎联系交流。
Android Studio 4.1.3
Android 4 以上环境
java 语言
计算器程序速览
工程模拟界面创建Android 工程,选择 java语言,Android最低版本
创建Android新工程选择 java语言,Android最低版本4.1
在activity_main.xml文件中添加好布局信息
工程/app/src/main/res/layout/activity_main.xml
image.png
源代码如下:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/sv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:fillViewport="true"
android:fitsSystemWindows="true"
android:orientation="vertical">
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="35dp"
android:background="#9CCA6666"
android:fontFamily="monospace"
android:gravity="center"
android:text="TCID50计算器(专业版)"
android:textSize="24sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textViewTCID"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#B500BCD4"
android:gravity="center"
android:text="TCID50计算"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="请填写各稀释倍数的病变孔数(从低到高)(可为任意自然数)" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<EditText
android:id="@+id/cpe1"
style="@style/Widget.AppCompat.AutoCompleteTextView"
android:layout_width="45dp"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#59C6E6A1"
android:ems="10"
android:focusable="true"
android:focusableInTouchMode="true"
android:focusedByDefault="true"
android:gravity="center|center_horizontal|center_vertical"
android:hint="一"
android:inputType="number"
android:nextFocusRight="@id/cpe2"
android:nextFocusDown="@id/cpe2"
android:singleLine="true"
android:text="8"
android:textColorHint="#C9ECB599"
android:textStyle="bold" />
<EditText
android:id="@+id/cpe2"
android:layout_width="45dp"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#59C6E6A1"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:hint="二"
android:inputType="number"
android:nextFocusDown="@id/cpe3"
android:singleLine="true"
android:text="8"
android:textColorHint="#C9ECB599"
android:textStyle="bold" />
<EditText
android:id="@+id/cpe3"
android:layout_width="45dp"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#59C6E6A1"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:hint="三"
android:inputType="number"
android:nextFocusDown="@id/cpe4"
android:singleLine="true"
android:text="8"
android:textColorHint="#C9ECB599"
android:textStyle="bold" />
<EditText
android:id="@+id/cpe4"
android:layout_width="45dp"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#59C6E6A1"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:hint="四"
android:inputType="number"
android:nextFocusDown="@id/cpe5"
android:singleLine="true"
android:text="7"
android:textColorHint="#C9ECB599"
android:textStyle="bold" />
<EditText
android:id="@+id/cpe5"
android:layout_width="45dp"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#59C6E6A1"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:hint="五"
android:inputType="number"
android:nextFocusDown="@id/cpe6"
android:singleLine="true"
android:text="3"
android:textColorHint="#C9ECB599"
android:textStyle="bold" />
<EditText
android:id="@+id/cpe6"
android:layout_width="45dp"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#59C6E6A1"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:hint="六"
android:inputType="number"
android:nextFocusDown="@id/cpe7"
android:singleLine="true"
android:text="1"
android:textColorHint="#C9ECB599"
android:textStyle="bold" />
<EditText
android:id="@+id/cpe7"
android:layout_width="45dp"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#59C6E6A1"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:hint="七"
android:inputType="number"
android:nextFocusDown="@id/cpe8"
android:singleLine="true"
android:text="0"
android:textColorHint="#C9ECB599"
android:textStyle="bold" />
<EditText
android:id="@+id/cpe8"
android:layout_width="45dp"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:layout_weight="1"
android:background="#59C6E6A1"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:hint="八"
android:inputType="number"
android:singleLine="true"
android:text="0"
android:textColorHint="#C9ECB599"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="80dp"
android:layout_height="wrap_content"
android:text="上液量:" />
<EditText
android:id="@+id/volume"
android:layout_width="93dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:text="0.1"
android:textSize="14sp" />
<TextView
android:layout_width="48dp"
android:layout_height="wrap_content"
android:text=" mL" />
<TextView
android:id="@+id/textView15"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="(一般为0.1, 0.2, 1mL)" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="115dp"
android:layout_height="wrap_content"
android:text="每梯度重复数: " />
<EditText
android:id="@+id/repition"
android:layout_width="83dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="10"
android:gravity="center"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:text="8"
android:textSize="14sp" />
<TextView
android:id="@+id/textView17"
android:layout_width="137dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=" (可为任意正整数)"
android:textStyle="italic" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="146dp"
android:layout_height="wrap_content"
android:text="起始稀释倍数的-lg:" />
<EditText
android:id="@+id/initial"
android:layout_width="75dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:text="-1"
android:textSize="14sp" />
<TextView
android:id="@+id/textView14"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=" (-1指起始稀释倍数为10)"
android:textStyle="italic" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="原液的TCID50 为:"
android:textStyle="bold" />
<TextView
android:id="@+id/textView19"
android:layout_width="22dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:text="10"
android:textSize="18sp"
android:textStyle="bold" />
<EditText
android:id="@+id/results"
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#43CA6C6C"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView18"
android:layout_width="11dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:text="/"
android:textSize="24sp"
android:textStyle="bold" />
<EditText
android:id="@+id/unit"
android:layout_width="71dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:text="1"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView"
android:layout_width="32dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:text="mL "
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="55dp"
android:orientation="horizontal">
<Button
android:id="@+id/quit1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="0dp"
android:text="退出"
android:textColor="#BD6666"
app:backgroundTint="#607438B8" />
<Button
android:id="@+id/clearButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_weight="1"
android:padding="0dp"
android:text="清除"
app:backgroundTint="#88BD5757" />
<Button
android:id="@+id/calc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/purple_200"
android:hapticFeedbackEnabled="true"
android:padding="0dp"
android:text="计算"
android:textColor="#BF053542"
android:textStyle="bold"
app:backgroundTint="#7C70B2EA" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="2"
android:background="#8800BCD4"
android:gravity="center"
android:text="后续计算"
android:textSize="18sp"
android:textStyle="bold" />
<Button
android:id="@+id/filltcid"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_weight="0.3"
android:background="#BB86FC"
android:padding="4dp"
android:text="向下填充"
android:textColor="#E2FFFFFF"
android:textSize="12sp"
android:textStyle="bold"
app:backgroundTint="#700E7513" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/textView4"
android:layout_width="88dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:gravity="bottom"
android:text="当TCID50为: " />
<TextView
android:id="@+id/textView27"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:gravity="bottom"
android:text="10"
android:textSize="18sp" />
<EditText
android:id="@+id/tcid2"
android:layout_width="77dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="10"
android:gravity="center|center_horizontal|top|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:textSize="14sp" />
<TextView
android:id="@+id/textView21"
android:layout_width="18dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:text=" /"
android:textSize="18sp" />
<EditText
android:id="@+id/unit2"
android:layout_width="64dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:text="1"
android:textSize="14sp" />
<TextView
android:id="@+id/textView13"
android:layout_width="42dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:gravity="bottom"
android:text=" mL"
android:textSize="18sp" />
</LinearLayout>
<View
android:id="@+id/view"
android:layout_width="wrap_content"
android:layout_height="2dp"
android:background="#90349829" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textView308"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#7C9AD1D6"
android:gravity="center"
android:text="根据TCID50滴度和指定的TCID50数目和要求剂量,求稀释倍数"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/tc1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textView20"
android:layout_width="54dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="想要稀释得到"
android:textSize="14sp" />
<EditText
android:id="@+id/volume200"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="2"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:text="200"
android:textSize="14sp" />
<TextView
android:id="@+id/textView22"
android:layout_width="wrap_content"
android:layout_height="22dp"
android:text="uL"
android:textSize="18sp" />
<EditText
android:id="@+id/tcid200"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="2"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:text="200"
android:textSize="14sp" />
<TextView
android:id="@+id/textView23"
android:layout_width="21dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="个TCID50"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/tc2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textView24"
android:layout_width="13dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="需要稀释"
android:textSize="14sp"
android:textStyle="bold" />
<EditText
android:id="@+id/folds"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#43CA6C6C"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView25"
android:layout_width="64dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=" 倍"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="2dp"
android:background="#90349829" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textView309"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#7C9AD1D6"
android:gravity="center"
android:text="根据TCID0滴度和指定的细胞数量和MOI,求所需原液的量"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textView5"
android:layout_width="97dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="细胞数量为:" />
<EditText
android:id="@+id/cells"
android:layout_width="101dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:text="500000"
android:textSize="14sp" />
<TextView
android:id="@+id/textView16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="个 (默认为5x10^5个)" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textView6"
android:layout_width="105dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="要计算的MOI为: " />
<EditText
android:id="@+id/moi"
android:layout_width="68dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#5991CBE4"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:text="1"
android:textSize="14sp" />
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="时(一般 为,0.01,0.1,1或5)," />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textView8"
android:layout_width="136dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="需要加入病毒原液的量为: "
android:textStyle="bold" />
<EditText
android:id="@+id/needvolume"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#43CA6C6C"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="uL"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:id="@+id/textView11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="此时,感染的细胞比率为: "
android:textStyle="bold" />
<EditText
android:id="@+id/infectratio"
android:layout_width="69dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#43CA6C6C"
android:ems="10"
android:gravity="center|center_horizontal|center_vertical"
android:inputType="numberSigned|number|numberDecimal"
android:singleLine="true"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="% "
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView26"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="(泊松分布规律)"
android:textStyle="italic" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<Button
android:id="@+id/clear2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#FFFFFF"
android:text="清除"
app:backgroundTint="#88BD5757" />
<Button
android:id="@+id/help"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#FFFFFF"
android:text="帮助"
app:backgroundTint="#7E8BC34A" />
<Button
android:id="@+id/version"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#FFFFFF"
android:text="隐私政策"
app:backgroundTint="#7E8BC34A" />
<Button
android:id="@+id/calc2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#FFFFFF"
android:text="计算"
android:textColor="#BF053542"
android:textStyle="bold"
app:backgroundTint="#7C70B2EA" />
</LinearLayout>
<View
android:id="@+id/view2"
android:layout_width="wrap_content"
android:layout_height="5dp"
android:background="#90349829" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:adjustViewBounds="true"
app:srcCompat="@drawable/bg1p" />
<ImageView
android:id="@+id/imageView8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:adjustViewBounds="true"
app:srcCompat="@drawable/bg2p" />
<ImageView
android:id="@+id/imageView9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:adjustViewBounds="true"
app:srcCompat="@drawable/bg3p" />
<ImageView
android:id="@+id/imageView10"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:adjustViewBounds="true"
app:srcCompat="@drawable/bg4p" />
</LinearLayout>
</LinearLayout>
</ScrollView>
在MainActivity.java中添加主程序代码
工程/app/src/main/java/com.example.tcid50/Mainactivity.java
主程序代码
源代码如下:
package com.example.tcid50;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.text.DecimalFormat;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public EditText editText1,editText2,editText3,editText4,editText5,editText6,editText7,
editText8,editText9;
public EditText volume,repition, initial;
public EditText tcid2,unit;
public EditText volume200,tcid200,cells,folds,unit2,moi;
/**
* 说明:
* 1. SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖。
* 2. SYSTEM_UI_FLAG_LIGHT_STATUS_BAR:设置状态栏图标为黑色或者白色
* 3. StatusBarUtil 工具类是修改状态栏的颜色为白色。
*/
private <PopularityListActivity> void initStatusBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
// StatusBarUtils.setStatusBarColor(PopularityListActivity.this, R.color.colorWhite);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initStatusBar();//初始化状态栏
Button button = (Button)findViewById(R.id.calc);
Button clearbutton=(Button)findViewById(R.id.clearButton);
//获取控件 公共
EditText results = (EditText) findViewById(R.id.results);
editText1 = (EditText) findViewById(R.id.cpe1);
editText2 = (EditText) findViewById(R.id.cpe2);
editText3 = (EditText) findViewById(R.id.cpe3);
editText4 = (EditText) findViewById(R.id.cpe4);
editText5 = (EditText) findViewById(R.id.cpe5);
editText6 = (EditText) findViewById(R.id.cpe6);
editText7 = (EditText) findViewById(R.id.cpe7);
editText8 = (EditText) findViewById(R.id.cpe8);
editText9 = (EditText) findViewById(R.id.results);
volume = (EditText) findViewById(R.id.volume);
repition = (EditText) findViewById(R.id.repition);
initial = (EditText) findViewById(R.id.initial);
tcid2 = (EditText) findViewById(R.id.tcid2);
unit = (EditText) findViewById(R.id.unit);
volume200 = (EditText) findViewById(R.id.volume200);
tcid200 = (EditText) findViewById(R.id.tcid200);
folds = (EditText) findViewById(R.id.folds);
unit2 = (EditText)findViewById(R.id.unit2);
cells = (EditText)findViewById(R.id.cells);
moi = (EditText)findViewById(R.id.moi);
button.setOnClickListener(this);
clearbutton.setOnClickListener(this);
//绑定按钮
Button quit1 = (Button)findViewById(R.id.quit1);
//Button quit2 = (Button)findViewById(R.id.quit2);
Button filltcid = (Button)findViewById(R.id.filltcid);
Button calc2 = (Button)findViewById(R.id.calc2);
Button help = (Button)findViewById(R.id.help);
Button clear2 = (Button)findViewById(R.id.clear2);
Button version = (Button)findViewById(R.id.version);
//监听按钮
quit1.setOnClickListener(this);
//quit2.setOnClickListener(this);
filltcid.setOnClickListener(this);
calc2.setOnClickListener(this);
help.setOnClickListener(this);
clear2.setOnClickListener(this);
version.setOnClickListener(this);
}
//显示帮助信息
private void showDialogHelp(){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
// builder.setIcon(R.drawable.asdf);
builder.setTitle("帮助信息");
builder.setMessage("\n本款TCID50计算器采用Reed-Muench两氏法,可用于计算TCID50, EID50等.\n增强版另增加后续计算功能. " +
"\n\n1.本软件分为上下两部分,均可独立运行" +
"\n\t\t 1).TCID50计算器可以根据重复数、各稀释倍数的病变孔数和起始稀释倍数的-lg对数来计算病毒原液的滴度" +
"\n\t\t 2).后续计算器可以根据TCID50滴度、细胞数量和需要的感染复数MOI,计算出需要病毒液的体积和显示出细胞感染比率" +
"\n\t\t 3).或者可以根据TCID50滴度、计算出要得到某一剂量和含特定TCID50数目的病毒液,病毒原液所需要稀释的倍数" +
"\n\n2.下方MOI计算器中的TCID50值可由上方TCID50计算器计算结果直接填充得到" +
"\n\n3.如果程序发生闪退请确认输入数据无误"+
"\n\n4.有任何疑问可以联系作者,感谢使用" +
"\n\n版本号:5.0.1" +
"\n作者:艾强云" +
"\n联系方式(E-mail):1154282938@qq.com" +
"\n\n华南农业大学兽医学院传染病教研室制品 \nCopyright © 2021 SCAU");
AlertDialog dialog=builder.create();
dialog.show();
}
//显示隐私政策信息
private void showDialogPrivacy(){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
// builder.setIcon(R.drawable.asdf);
builder.setTitle("隐私政策");
builder.setMessage(
"\n本应用尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息。但本应用将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定" +
"\n1. 适用范围" +
"\n (a) 在您注册本应用帐号时,您根据本应用要求提供的个人注册信息;" +
"\n (b) 在您使用本应用网络服务,或访问本应用平台网页时,本应用自动接收并记录的您的浏览器和计算机上的信息,包括但不限于您的IP地址、浏览器的类型、使用的语言、访问日期和时间、软硬件特征信息及您需求的网页记" +
"\n (c) 本应用通过合法途径从商业伙伴处取得的用户个人数据。" +
"\n您了解并同意,以下信息不适用本隐私权政策:" +
"\n (a) 您在使用本应用平台提供的搜索服务时输入的关键字信息;" +
"\n (b) 本应用收集到的您在本应用发布的有关信息数据,包括但不限于参与活动、成交信息及评价详情;" +
"\n (c) 违反法律规定或违反本应用规则行为及本应用已对您采取的措施。" +
"\n2. 信息使用" +
"\n (a) 本应用不会向任何无关第三方提供、出售、出租、分享或交易您的个人信息,除非事先得到您的许可,或该第三方和本应用(含本应用关联公司)单独或共同为您提供服务,且在该服务结束后,其将被禁止访问包括其以前能够" +
"\n (b) 本应用亦不允许任何第三方以任何手段收集、编辑、出售或者无偿传播您的个人信息。任何本应用平台用户如从事上述活动,一经发现,本应用有权立即终止与该用户的服务协议。" +
"\n (c) 为服务用户的目的,本应用可能通过使用您的个人信息,向您提供您感兴趣的信息,包括但不限于向您发出产品和服务信息,或者与本应用合作伙伴共享信息以便他们向您发送有关其产品和服务的信息(后者需要您的事先同" +
"\n3. 信息披露" +
"\n在如下情况下,本应用将依据您的个人意愿或法律的规定全部或部分的披露您的个人信息:" +
"\n (a) 经您事先同意,向第三方披露;" +
"\n (b) 为提供您所要求的产品和服务,而必须和第三方分享您的个人信息;" +
"\n (c) 根据法律的有关规定,或者行政或司法机构的要求,向第三方或者行政、司法机构披露;" +
"\n (d) 如您出现违反中国有关法律、法规或者本应用服务协议或相关规则的情况,需要向第三方披露;" +
"\n (e) 如您是适格的知识产权投诉人并已提起投诉,应被投诉人要求,向被投诉人披露,以便双方处理可能的权利纠纷;" +
"\n (f) 在本应用平台上创建的某一交易中,如交易任何一方履行或部分履行了交易义务并提出信息披露请求的,本应用有权决定向该用户提供其交易对方的联络方式等必要信息,以促成交易的完成或纠纷的解决。" +
"\n (g) 其它本应用根据法律、法规或者网站政策认为合适的披露。" +
"\n4. 信息存储和交换" +
"\n 本应用收集的有关您的信息和资料将保存在本应用及(或)其关联公司的服务器上,这些信息和资料可能传送至您所在国家、地区或本应用收集信息和资料所在地的境外并在境外被访问、存储和展示。" +
"\n5. Cookie的使用" +
"\n (a) 在您未拒绝接受cookies的情况下,本应用会在您的计算机上设定或取用cookies ,以便您能登录或使用依赖于cookies的本应用平台服务或功能。本应用使用cookies可为您提供更加周到的个性化" +
"\n (b) 您有权选择接受或拒绝接受cookies。您可以通过修改浏览器设置的方式拒绝接受cookies。但如果您选择拒绝接受cookies,则您可能无法登录或使用依赖于cookies的本应用网络服务或功能。" +
"\n (c) 通过本应用所设cookies所取得的有关信息,将适用本政策。" +
"\n6. 信息安全" +
"\n (a) 本应用帐号均有安全保护功能,请妥善保管您的用户名及密码信息。本应用将通过对用户密码进行加密等安全措施确保您的信息不丢失,不被滥用和变造。" +
"\n (b) 在使用本应用网络服务时,请注意不法分子向您索取信息。" +
"\n7.本隐私政策的更改" +
"\n (a) 如果决定更改隐私政策,我们会在本政策中、本公司网站中以及我们认为适当的位置发布这些更改,以便您了解我们如何收集、使用您的个人信息,哪些人可以访问这些信息,以及在什么情况下我们会透露这些信息。" +
"\n (b)本公司保留随时修改本政策的权利,因此请经常查看。如对本政策作出重大更改,本公司会通过网站通知的形式告知。" +
"\n方披露自己的个人信息,如联络方式或者邮政地址。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息泄密,尤其是本应用用户名及密码发生泄露,请您立即联络本应用客服,以便本应用采取相应措施。" +
"\n");
AlertDialog dialog=builder.create();
dialog.show();
}
private void showDialogError(){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
// builder.setIcon(R.drawable.asdf);
builder.setTitle("警告!");
builder.setMessage("请确认数据输入正确且完整!\n\n当前有默认填充数据!\n\n请仔细检查并重新输入!");
AlertDialog dialog=builder.create();
dialog.show();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.calc:
Double[] nocpe = new Double[8];
Double[] cpeacc = new Double[8];
Double[] nocpeacc = new Double[8];
Double[] allacc = new Double[8];
Double[] cperatio = new Double[8];
//如果没有输入,默认为0
if(editText1.getText().toString()==null||"".equals(editText1.getText().toString()))//判断是否为空
editText1.setText("0");
if(editText2.getText().toString()==null||"".equals(editText2.getText().toString()))//判断是否为空
editText2.setText("0");
if(editText3.getText().toString()==null||"".equals(editText3.getText().toString()))//判断是否为空
editText3.setText("0");
if(editText4.getText().toString()==null||"".equals(editText4.getText().toString()))//判断是否为空
editText4.setText("0");
if(editText5.getText().toString()==null||"".equals(editText5.getText().toString()))//判断是否为空
editText5.setText("0");
if(editText6.getText().toString()==null||"".equals(editText6.getText().toString()))//判断是否为空
editText6.setText("0");
if(editText7.getText().toString()==null||"".equals(editText7.getText().toString()))//判断是否为空
editText7.setText("0");
if(editText8.getText().toString()==null||"".equals(editText8.getText().toString()))//判断是否为空
editText8.setText("0");
// 上液量
if(volume.getText().toString()==null||"".equals(volume.getText().toString()))//判断是否为空
editText8.setText("0.1");
//重复数
if(repition.getText().toString()==null||"".equals(repition.getText().toString()))//判断是否为空
editText8.setText("-1");
//起始稀释倍数的-lg
if(initial.getText().toString()==null||"".equals(initial.getText().toString()))//判断是否为空
editText8.setText("-1");
//获取从输入框中输入转化为整型
int cpe1 = Integer.parseInt(editText1.getText().toString());
int cpe2 = Integer.parseInt(editText2.getText().toString());
int cpe3 = Integer.parseInt(editText3.getText().toString());
int cpe4 = Integer.parseInt(editText4.getText().toString());
int cpe5 = Integer.parseInt(editText5.getText().toString());
int cpe6 = Integer.parseInt(editText6.getText().toString());
int cpe7 = Integer.parseInt(editText7.getText().toString());
int cpe8 = Integer.parseInt(editText8.getText().toString());
if(cpe1==0&&cpe2==0&&cpe3==0&&cpe4==0&&cpe5==0&&cpe6==0&&cpe7==0&&cpe8==0){
cpe1=cpe2=cpe3=8;
cpe4=7;
cpe5=3;
cpe6=1;
cpe7=0;
cpe8=0;
editText1.setText("8");
editText2.setText("8");
editText3.setText("8");
editText4.setText("7");
editText5.setText("3");
editText6.setText("1");
editText7.setText("0");
editText8.setText("0");
showDialogError();
}
Double volume_calc = Double.parseDouble((volume.getText().toString()));
Double repition_calc = Double.parseDouble((repition.getText().toString()));
Double initial_calc = Double.parseDouble((initial.getText().toString()));
Double unit_calc = Double.parseDouble((unit.getText().toString()));
//TCID50 计算核心算法 Reed-Muench两氏法
//1,先将CPE处理成数组
//2, 计算noCPE数组,CPE累积,noCPE累积,总累积,找到整数位,计算距离,计算-lg,输出
double[] cpe_arr = {cpe1, cpe2, cpe3, cpe4, cpe5, cpe6, cpe7, cpe8};
int gd50 = 0;
double gd50z = 0, d50 = 0;
int i = 0;
for (i = 0; i < 8; i++) {
nocpe[i] = repition_calc - cpe_arr[i];
}
Double acc = 0.0;
for (i = 7; i >= 0; i--) {//CPE累积
acc = acc + cpe_arr[i];
cpeacc[i] = acc;
}
Double acc2 = 0.0;
for (i = 0; i < 8; i++) {//非CPE累积
acc2 = acc2 + nocpe[i];
nocpeacc[i] = acc2;
}
for (i = 0; i < 8; i++) {//z累积
allacc[i] = cpeacc[i] + nocpeacc[i];
}
for (i = 0; i < 8; i++) {//ratio
cperatio[i] = cpeacc[i] / allacc[i];
}
for (i = 7; i >= 0; i--) {//高于或等于50%且最接近50%的序号
if (cperatio[i] >= 0.5) {
gd50z = cperatio[i];
gd50 = i;
break;
}
}
for (i = 0; i < 8; i++) {//低于或等于50%且最接近50%的序号
if (cperatio[i] <= 0.5) {
d50 = cperatio[i];
break;
}
}
//计算距离
Double s;
s =((gd50z - 0.5) / (gd50z - d50));
//计算lg(TCID50)
Double tcid50 = 0.0;
tcid50 = -(gd50 + 1 + s );//本来加1(由于数组是0开始)
//处理数据 体积 起始稀释倍数
double Logarithm = unit_calc/volume_calc;
Double volume_change = Math.log(Logarithm)/Math.log(10);
tcid50 = tcid50 - volume_change;
//处理起始数值
tcid50 = tcid50 + 1 + initial_calc;
// //处理结果单位
// Double volume_change = Math.log(Logarithm)/Math.log(10);
// if volume_index == 0:
// tcid50 = tcid50_value_init - 1
// elif volume_index == 1:
// tcid50 = tcid50_value_init - math.log(5, 10) 5是倍数 10是底 log 10 5
// else:
// tcid50 = tcid50_value_init
// return tcid50
//String tcid = String.valueOf(tcid50);
// String gd50z1 = String.valueOf(gd50z);
// String gd501 = String.valueOf(gd50);
// String d501 = String.valueOf(d50);
// //Float.toString(tcid50);
DecimalFormat df=new DecimalFormat("#.0000");//格式化为2位小数的字符串
String tcid_df = df.format(tcid50);
EditText results = (EditText) findViewById(R.id.results);
results.setText(tcid_df);
//
// Toast.makeText(MainActivity.this, (int) tcid50,
// Toast.LENGTH_SHORT).show();
break;
// 清除输入框
case R.id.clearButton:
EditText cpe1B = (EditText) findViewById(R.id.cpe1);
cpe1B.setText("");
EditText cpe2B = (EditText) findViewById(R.id.cpe2);
cpe2B.setText("");
EditText cpe3B = (EditText) findViewById(R.id.cpe3);
cpe3B.setText("");
EditText cpe4B = (EditText) findViewById(R.id.cpe4);
cpe4B.setText("");
EditText cpe5B = (EditText) findViewById(R.id.cpe5);
cpe5B.setText("");
EditText cpe6B = (EditText) findViewById(R.id.cpe6);
cpe6B.setText("");
EditText cpe7B = (EditText) findViewById(R.id.cpe7);
cpe7B.setText("");
EditText cpe8B = (EditText) findViewById(R.id.cpe8);
cpe8B.setText("");
EditText results_clear = (EditText) findViewById(R.id.results);
results_clear.setText("");
break;
// 填充MTCID50计算结果
case R.id.filltcid:
EditText results_filltcid = (EditText) findViewById(R.id.results);
String results_fillticd = results_filltcid.getText().toString();
EditText tcid2_fillticd = (EditText) findViewById(R.id.tcid2);
tcid2_fillticd.setText(results_fillticd);
Double unit_filltcid = Double.parseDouble((unit.getText().toString()));
String unit_filltcidst = Double.toString(unit_filltcid);
EditText unit2_calc2 = (EditText) findViewById(R.id.unit2);
unit2_calc2.setText(unit_filltcidst);
// Double unit2 = Double.parseDouble(unit2_calc2.getText().toString());
break;
// 计算MOI
case R.id.calc2:
//获取从输入框中输入转化为整型
//起始稀释倍数的-lg
if(tcid2.getText().toString()==null||"".equals(tcid2.getText().toString())) {//判断是否为空
tcid2.setText("-6");
showDialogError();
}
// 单位默认填充
if(unit2.getText().toString()==null||"".equals(unit2.getText().toString()))//判断是否为空
unit2.setText("1");
// 上液量
if(volume200.getText().toString()==null||"".equals(volume200.getText().toString()))//判断是否为空
volume200.setText("200");
// 上液量
if(tcid200.getText().toString()==null||"".equals(tcid200.getText().toString()))//判断是否为空
tcid200.setText("200");
// 上液量
if(cells.getText().toString()==null||"".equals(cells.getText().toString()))//判断是否为空
cells.setText("500000");
// 上液量
if(moi.getText().toString()==null||"".equals(moi.getText().toString()))//判断是否为空
moi.setText("1");
//获取原液TCID50
EditText tcid2_calc2 = (EditText) findViewById(R.id.tcid2);
Double tcid2 = Double.parseDouble(tcid2_calc2.getText().toString());
EditText unit2_fill = (EditText) findViewById(R.id.unit2);
Double unit2 = Double.parseDouble(unit2_fill.getText().toString());
//获取细胞数量
EditText cells_calc2 = (EditText) findViewById(R.id.cells);
Double cell_count = Double.parseDouble(cells_calc2.getText().toString());
//获取 想要的MOI
EditText moi_calc2 = (EditText) findViewById(R.id.moi);
Double moi_value = Double.parseDouble(moi_calc2.getText().toString());
//需要的原液体积
EditText needvolumn_calc2 = (EditText) findViewById(R.id.needvolume);
//float virus_volume = Float.parseFloat(needvolumn_calc2.getText().toString());
//此时感染的细胞所占比率
EditText infectratio_calc2 = (EditText) findViewById(R.id.infectratio);
//float infectratio = Float.parseFloat(infectratio_calc2.getText().toString());
//转化为病毒mL滴度
Double exponent = (Math.log(unit2))/(Math.log(10));
tcid2 = tcid2 + exponent;
//计算所需病毒液体积,并显示
double denominator= 0.7 *(Math.pow(10, (-tcid2)));
double virus_volume = ((moi_value * cell_count) / denominator)*1000 ; //变微升需x1000
DecimalFormat df2=new DecimalFormat("#.00");//格式化为2位小数的字符串
String virus_volume_df = df2.format(virus_volume);
needvolumn_calc2.setText(virus_volume_df);
//计算MOI
double e = Math.E;
double p0 = Math.pow(e,-moi_value);
double p1 = (1 - p0) * 100;
//double m = -Math.log(p0);
//double m = -(Math.log(p1))/(Math.log(e));
String p1_df = df2.format(p1);
infectratio_calc2.setText(p1_df);
//计算稀释倍数
EditText volume200 = (EditText) findViewById(R.id.volume200);
Double volume200_calc2 = Double.parseDouble(volume200.getText().toString());
EditText tcid200 = (EditText) findViewById(R.id.tcid200);
Double tcid200_calc2 = Double.parseDouble(tcid200.getText().toString());
EditText folds = (EditText) findViewById(R.id.folds);
Double unit_calc2 = Double.parseDouble((unit.getText().toString()));
Double folds_calc2 = 0.0;
folds_calc2 = ((Math.pow(10,-tcid2)) * (volume200_calc2/1000))/((tcid200_calc2) * unit_calc2);
String folds_calc_df = df2.format(folds_calc2);
folds.setText(folds_calc_df);
break;
// 退出1
case R.id.quit1:
android.os.Process.killProcess(android.os.Process.myPid());
break;
// // 退出2
// case R.id.quit2:
// android.os.Process.killProcess(android.os.Process.myPid());
// break;
// 帮助信息
case R.id.help:
showDialogHelp();
break;
// 版权信息
case R.id.clear2:
EditText tcid2_clear2 = (EditText) findViewById(R.id.tcid2);
EditText unit2_clear2 = (EditText) findViewById(R.id.unit2);
EditText fold_clear2 = (EditText) findViewById(R.id.folds);
EditText needvolume_clear2 = (EditText) findViewById(R.id.needvolume);
EditText infectratio_clear2 = (EditText) findViewById(R.id.infectratio);
tcid2_clear2.setText("");
unit2_clear2.setText("");
fold_clear2.setText("");
needvolume_clear2.setText("");
infectratio_clear2.setText("");
break;
// 版本信息
case R.id.version:
showDialogPrivacy();
break;
default:
break;
}
}
}
主题文件
工程/app/src/main/res/values/themes.xml
更改
parent="Theme.MaterialComponents.DayNight.NoActionBar"
代码如下:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TCID50" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat" tools:ignore="NewApi">true</item>
</style>
</resources>
网友评论