Android ListFragment 重叠
Android ListFragment overlapping
我正在学习 android 开发,但我被困在 Fragments
中。我已经阅读了教程要点书和一些 android 开发人员文档,所以下一步是为我的手机 phone.
构建一个应用程序
我正在列一份购物清单。当您启动应用程序时,会显示一个菜单,其中显示三个选项,有问题的是第三个。
想法是允许用户创建更新并从该列表中删除产品。
这就是我到目前为止所做的
product_crud.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="116dp">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/name_txt"
android:hint="@string/product_name"
android:inputType="text"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_add"
android:paddingLeft="10px"
android:text="@string/add_product"
android:layout_below="@+id/name_txt"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/android:list"
android:layout_below="@+id/btn_add"
android:layout_alignParentStart="true" />
</LinearLayout>
crudrowlayout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="10px"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_delete"
android:text="@string/remove_product"
android:layout_gravity="right"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_name"
android:textSize="40px"
android:layout_alignTop="@+id/btn_delete"
android:layout_alignParentStart="true"
android:layout_alignBottom="@+id/btn_delete" />
</RelativeLayout>
PM_List_Fragment
public class PM_List_Fragment extends ListFragment {
ProductsDataSource products;
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
products = new ProductsDataSource(getActivity());
try {
products.open();
} catch (SQLException e) {
e.printStackTrace();
}
CrudArrayAdapter crudArrayAdapter = new CrudArrayAdapter(getActivity(),products.getAllProducts());
products.close();
setListAdapter(crudArrayAdapter);
}
}
适配器
public class CrudArrayAdapter extends ArrayAdapter<Product> {
private final List<Product> list;
private final Activity context;
static class ViewHolder{
protected TextView name;
protected Button delete;
}
public CrudArrayAdapter(Activity context,List<Product> list) {
super(context, R.layout.rowlayout,list);
this.list = list;
this.context = context;
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
View view;
if(convertView == null){
LayoutInflater inflater = context.getLayoutInflater();
view = inflater.inflate(R.layout.crudrowlayout,null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.name = (TextView)view.findViewById(R.id.text_name);
viewHolder.delete = (Button)view.findViewById(R.id.btn_delete);
view.setTag(viewHolder);
}else{
view = convertView;
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.name.setText(list.get(position).getName());
return view;
}
}
和我的activity
public class CrudProducts extends ListActivity {
private String msg = "Android: ";
private ProductsDataSource productsDataSource;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
setContentView(R.layout.product_crud);
PM_List_Fragment pm_list_fragment = new PM_List_Fragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(android.R.id.content,pm_list_fragment);
Button btn_add = (Button)this.findViewById(R.id.btn_add);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//create a form or put some input text so we can update the db!
EditText editText = (EditText)findViewById(R.id.name_txt);
if(editText.getText().length() > 0 && !productsDataSource.exists(editText.getText().toString())){
Product prod = productsDataSource.createProduct(editText.getText().toString());
// adapter.add(prod);
}else{
if(editText.getText().length() == 0 )
{
Toast.makeText(getApplicationContext(),"Please insert a name",Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(getApplicationContext(),"This product already exists",Toast.LENGTH_LONG).show();
}
}
// adapter.notifyDataSetChanged();
}
});
fragmentTransaction.commit();
}
}
不用担心数据源或适配器,这里的问题是 ListView
与 EditText
和 Button
重叠 (deleteBtn) 。
列表视图显示在 EditText
和 Button
上方。我尝试以不同的方式更改布局,但 none 行得通。
我了解到您可以使用普通 activity 和 ListView
实现相同的功能,但我想学习如何以这种方式实现。
一些想法?
问题图片:
您的主视图是LinearLayout,尝试将其更改为RelativeLayout。
你应该这样尝试:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_alignParentTop="true"
android:id="@+id/buttonView"
android:layout_width="match_parent"
android:layout_height="116dp"
android:orientation="vertical">
<EditText
android:id="@+id/name_txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:inputType="text" />
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/name_txt"
android:paddingLeft="10px"
/>
</RelativeLayout>
<ListView
android:id="@+id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_below="@+id/buttonView" />
</RelativeLayout>
这将导致:
好吧,我注意到了一些可能对您有所帮助的事情!
首先,CrudProducts extends ListActivity
和PM_List_Fragment extends ListFragment
。如果您打算显示一个列表,您应该只依赖 ListFragment
。你可以让 CrudProducts
简单地扩展一个 Activity
.
如果这样做,您可以使用 setContentView(R.layout.crud_activity)
为 CrudProducts
设置以下布局
crud_activity.xml
<?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:orientation="vertical" >
<FrameLayout
android:id="@android:id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
其次,在您的片段中 PM_List_Fragment
添加
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.product_crud, container, false);
return view;
}
第三,product_crud.xml还需要细化
您的 <ListView>
不需要以下属性,因为 ListView
的 parent 不是 RelativeLayout
android:layout_below="@+id/btn_add"
android:layout_alignParentStart="true"
此外,您 RelativeLayout
的孩子也不需要
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"
而是试着让你的 Button
变成 match_parent
<Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
也可以在 dp
中为您的 Button
尝试平衡填充
android:paddingLeft="10dp"
android:paddingRight="10dp"
以上应该可以解决您的问题,列表应该可以正常显示。
我正在学习 android 开发,但我被困在 Fragments
中。我已经阅读了教程要点书和一些 android 开发人员文档,所以下一步是为我的手机 phone.
我正在列一份购物清单。当您启动应用程序时,会显示一个菜单,其中显示三个选项,有问题的是第三个。
想法是允许用户创建更新并从该列表中删除产品。
这就是我到目前为止所做的
product_crud.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="116dp">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/name_txt"
android:hint="@string/product_name"
android:inputType="text"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_add"
android:paddingLeft="10px"
android:text="@string/add_product"
android:layout_below="@+id/name_txt"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/android:list"
android:layout_below="@+id/btn_add"
android:layout_alignParentStart="true" />
</LinearLayout>
crudrowlayout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="10px"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_delete"
android:text="@string/remove_product"
android:layout_gravity="right"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_name"
android:textSize="40px"
android:layout_alignTop="@+id/btn_delete"
android:layout_alignParentStart="true"
android:layout_alignBottom="@+id/btn_delete" />
</RelativeLayout>
PM_List_Fragment
public class PM_List_Fragment extends ListFragment {
ProductsDataSource products;
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
products = new ProductsDataSource(getActivity());
try {
products.open();
} catch (SQLException e) {
e.printStackTrace();
}
CrudArrayAdapter crudArrayAdapter = new CrudArrayAdapter(getActivity(),products.getAllProducts());
products.close();
setListAdapter(crudArrayAdapter);
}
}
适配器
public class CrudArrayAdapter extends ArrayAdapter<Product> {
private final List<Product> list;
private final Activity context;
static class ViewHolder{
protected TextView name;
protected Button delete;
}
public CrudArrayAdapter(Activity context,List<Product> list) {
super(context, R.layout.rowlayout,list);
this.list = list;
this.context = context;
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
View view;
if(convertView == null){
LayoutInflater inflater = context.getLayoutInflater();
view = inflater.inflate(R.layout.crudrowlayout,null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.name = (TextView)view.findViewById(R.id.text_name);
viewHolder.delete = (Button)view.findViewById(R.id.btn_delete);
view.setTag(viewHolder);
}else{
view = convertView;
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.name.setText(list.get(position).getName());
return view;
}
}
和我的activity
public class CrudProducts extends ListActivity {
private String msg = "Android: ";
private ProductsDataSource productsDataSource;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
setContentView(R.layout.product_crud);
PM_List_Fragment pm_list_fragment = new PM_List_Fragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(android.R.id.content,pm_list_fragment);
Button btn_add = (Button)this.findViewById(R.id.btn_add);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//create a form or put some input text so we can update the db!
EditText editText = (EditText)findViewById(R.id.name_txt);
if(editText.getText().length() > 0 && !productsDataSource.exists(editText.getText().toString())){
Product prod = productsDataSource.createProduct(editText.getText().toString());
// adapter.add(prod);
}else{
if(editText.getText().length() == 0 )
{
Toast.makeText(getApplicationContext(),"Please insert a name",Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(getApplicationContext(),"This product already exists",Toast.LENGTH_LONG).show();
}
}
// adapter.notifyDataSetChanged();
}
});
fragmentTransaction.commit();
}
}
不用担心数据源或适配器,这里的问题是 ListView
与 EditText
和 Button
重叠 (deleteBtn) 。
列表视图显示在 EditText
和 Button
上方。我尝试以不同的方式更改布局,但 none 行得通。
我了解到您可以使用普通 activity 和 ListView
实现相同的功能,但我想学习如何以这种方式实现。
一些想法?
问题图片:
您的主视图是LinearLayout,尝试将其更改为RelativeLayout。 你应该这样尝试:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_alignParentTop="true"
android:id="@+id/buttonView"
android:layout_width="match_parent"
android:layout_height="116dp"
android:orientation="vertical">
<EditText
android:id="@+id/name_txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:inputType="text" />
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/name_txt"
android:paddingLeft="10px"
/>
</RelativeLayout>
<ListView
android:id="@+id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_below="@+id/buttonView" />
</RelativeLayout>
这将导致:
好吧,我注意到了一些可能对您有所帮助的事情!
首先,CrudProducts extends ListActivity
和PM_List_Fragment extends ListFragment
。如果您打算显示一个列表,您应该只依赖 ListFragment
。你可以让 CrudProducts
简单地扩展一个 Activity
.
如果这样做,您可以使用 setContentView(R.layout.crud_activity)
CrudProducts
设置以下布局
crud_activity.xml
<?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:orientation="vertical" >
<FrameLayout
android:id="@android:id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
其次,在您的片段中 PM_List_Fragment
添加
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.product_crud, container, false);
return view;
}
第三,product_crud.xml还需要细化
您的 <ListView>
不需要以下属性,因为 ListView
的 parent 不是 RelativeLayout
android:layout_below="@+id/btn_add"
android:layout_alignParentStart="true"
此外,您 RelativeLayout
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"
而是试着让你的 Button
变成 match_parent
<Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
也可以在 dp
Button
尝试平衡填充
android:paddingLeft="10dp"
android:paddingRight="10dp"
以上应该可以解决您的问题,列表应该可以正常显示。