根据在 Spinner 中选择的数字,相同的片段应该出现在另一个之下。如何?
Posted
技术标签:
【中文标题】根据在 Spinner 中选择的数字,相同的片段应该出现在另一个之下。如何?【英文标题】:Same Fragment Should Appear one below another according to the Number Selected in Spinner. HOW? 【发布时间】:2019-01-12 00:11:55 【问题描述】:我有一个带有三个 EditText 的小片段,我有一个带有 1、2、3 作为选项的 Spinner。
我想要做的是,当我从微调器中选择“1”时,我希望我的片段出现在同一个活动中的微调器下方。
当我在 Spinner 中选择“2”时,相同的 Fragment 应该在同一 Activity 中出现在另一个下方两次,当我从 Spinner 中选择“3”时也是如此。
这是 JAVA 代码
package com.globaltech2u.databaseapp1;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity
private Spinner spinner;
private String bookno[] = "#","1","2","3","4";
private ArrayAdapter<String> arrayAdapter;
private EditText editText,editText2,editText3;
private CheckBox checkBox;
private Button button;
private SQLiteDatabase db;
private Database mysqliteOpenHelper;
private Fragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.et1);
editText2 = (EditText)findViewById(R.id.et2);
editText3 = (EditText)findViewById(R.id.et3);
checkBox = (CheckBox)findViewById(R.id.cb1);
button = (Button)findViewById(R.id.button);
spinner = (Spinner)findViewById(R.id.booknoselectspinner);
arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, bookno);
spinner.setAdapter(arrayAdapter);
mySQLiteOpenHelper = new Database(this, "bookrecord", null, 1);
db = mySQLiteOpenHelper.getWritableDatabase();
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
String bookname = editText.getText().toString();
String bookno = editText2.getText().toString();
String issuedate = editText3.getText().toString();
String query = "insert into bookrecord(bookname,bookno,issuedate) values('"+bookname+"','"+bookno+"','"+issuedate+"')";
Log.e("query",query);
db.execSQL(query);
Toast.makeText(MainActivity.this, "inserted", Toast.LENGTH_SHORT).show();
);
final FragmentManager fragmentManager = getFragmentManager();
final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
@Override
public void onItemSelected(AdapterView<?> parent, View view, int i, long id)
for (int j=0;j<=i;j++)
BookentryFragment bookentryFragment = new BookentryFragment();
fragmentTransaction.replace(android.R.id.content, bookentryFragment);
fragmentTransaction.commit();
@Override
public void onNothingSelected(AdapterView<?> parent)
);
这是主要的活动 XML 文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_
android:layout_>
<TextView
android:layout_
android:layout_
android:text="Select No. of Books Issued"
android:id="@+id/tv4"
android:layout_centerHorizontal="true"
android:textColor="@color/colorAccent"
android:textSize="19dp"
/>
<Spinner
android:layout_
android:layout_
android:id="@+id/booknoselectspinner"
android:layout_toRightOf="@+id/tv4"
>
</Spinner>
<LinearLayout
android:layout_
android:layout_
android:id="@+id/FM1"
android:layout_below="@+id/tv4"
android:orientation="vertical"
>
</LinearLayout>
<Button
android:layout_
android:layout_
android:text="Save Record"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:id="@+id/button"
android:layout_below="@+id/FM1"
/>
</RelativeLayout>
这是片段文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_
android:layout_
android:padding="10dp"
android:background="@drawable/border">
<EditText
android:layout_
android:layout_
android:id="@+id/et1"
android:hint="Enter Book Name"
android:textAlignment="center"
android:layout_centerHorizontal="true"
android:layout_below="@+id/booknoselectspinner"
/>
<EditText
android:layout_
android:layout_
android:id="@+id/et2"
android:hint="Enter Book No."
android:textAlignment="center"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:layout_below="@+id/et1"
android:layout_centerHorizontal="true"
/>
<EditText
android:layout_
android:layout_
android:id="@+id/et3"
android:inputType="date"
android:hint="Select Issue Date"
android:textAlignment="center"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:layout_below="@+id/et2"
android:layout_centerHorizontal="true"
/>
<CheckBox
android:layout_
android:layout_
android:text="Remind me to Return"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:id="@+id/cb1"
android:layout_below="@+id/et3"
android:layout_centerHorizontal="true"
/>
</RelativeLayout>
让我知道是否需要添加其他内容
我尝试使用 WHILE 循环,但应用程序崩溃。请帮忙 谢谢你
我用这个 Layout Inflater 代码试过了。
FrameLayout item = (FrameLayout) findViewById(R.id.FM1);
View child = getLayoutInflater().inflate(R.layout.fragment_bookentry, null);
item.addView(child);
当我打开 Activity 时,它会添加一次 Fragment。
但是当我从微调器中选择 2 时,什么都没有发生。
我为此目的使用 Switch Case
switch (i)
case 0:
FrameLayout item = (FrameLayout) findViewById(R.id.FM1);
View child = getLayoutInflater().inflate(R.layout.fragment_bookentry, null);
item.addView(child);
break;
case 1:
FrameLayout item2 = (FrameLayout) findViewById(R.id.FM1);
View child2 = getLayoutInflater().inflate(R.layout.fragment_bookentry, null);
item2.addView(child2);
FrameLayout item3 = (FrameLayout) findViewById(R.id.FM1);
View child3 = getLayoutInflater().inflate(R.layout.fragment_bookentry, null);
item3.addView(child3);
break;
case 2:
FrameLayout item4 = (FrameLayout) findViewById(R.id.FM1);
View child4 = getLayoutInflater().inflate(R.layout.fragment_bookentry, null);
item4.addView(child4);
FrameLayout item5 = (FrameLayout) findViewById(R.id.FM1);
View child5 = getLayoutInflater().inflate(R.layout.fragment_bookentry, null);
item5.addView(child5);
FrameLayout item6 = (FrameLayout) findViewById(R.id.FM1);
View child6 = getLayoutInflater().inflate(R.layout.fragment_bookentry, null);
item6.addView(child6);
break;
【问题讨论】:
你应该在这里使用自定义视图,而不是片段。 喜欢使用列表视图并自定义它??? 更好的选择是使用LayoutInflator
扩充xml 并使用addView
添加它。
好的。我会试试的。非常感谢。
我已经更新了帖子,请检查一下
【参考方案1】:
将FrameLayout
设为类对象,并在switch
语句之外仅使用(FrameLayout) findViewById(R.id.FM1);
对其进行一次初始化。
在您的每个case
块中,在开头添加这段代码:
if(item.getChildCount()>0) item.removeAllViews();
编辑:您的微调器的 onItemSelected
将类似于:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int i, long id)
item.removeAllViews();
for (int j=0;j<=i;j++)
View v = getLayoutInflater().inflate(R.layout.fragmentXML, null);
item.addView(v);
【讨论】:
不适合我 在您的帮助下找到了解决方法。谢谢 这在某种程度上有所帮助,但我想出了自己的方法并将其发布在线程中以上是关于根据在 Spinner 中选择的数字,相同的片段应该出现在另一个之下。如何?的主要内容,如果未能解决你的问题,请参考以下文章
根据另一个 Spinner 选择 (LiveData) 过滤 Spinner 的 Observed ViewModel 数据
在 Fragment 中使用 Spinner 和 Adapter