根据在 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 数据

Android 日期选择器片段更改为微调器

如何通过多项选择重新调整 Spinner 中项目的高度?

在 Fragment 中使用 Spinner 和 Adapter

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

数字压力表如何选型