【问题标题】:Custom positioning of ListFragmentListFragment 的自定义定位
【发布时间】:2014-12-10 06:55:42
【问题描述】:

我有一个Activity,它在创建时会加载一个包含SearchViewButtonFrameLayout。按钮的onClick 方法在主FrameLayout 之上加载自定义ListFragment

我覆盖ListFragmentonCreate 方法以加载我的自定义ArrayAdapter 并使用我现在手动创建的字符串数组中的值填充列表。所有这些都可以正常工作,但我想在屏幕底部加载ListFragment

我尝试将主FrameLayout 的重力更改为底部,因为它是ListFragment 的父级,但这使得SearchViewButton 与@ 一起下降到屏幕底部987654336@.

在此示例中,我在列表中加载三行。如何将ListFragment 向下移动,以便在屏幕底部仅显示第一行,而在其下方(屏幕外)其他两行?

我的MapActivity是主Activity

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MapActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_map);

    }

    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_map, container, false);
        }
    }

    // Define the onShowTimesButtonClick listener
    public void onShowTimesButtonClick(View view){

        // Instantiate timeListFragment
        TimeListFragment timeListFragment = new TimeListFragment();

        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.add(R.id.container, timeListFragment, "timeList");
        transaction.commit();
    }
}

MapActivity的布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapActivity"
    tools:ignore="MergeRootFrame"
    android:clickable="true"
    android:focusable="false"
    android:focusableInTouchMode="false">

    <SearchView
        android:layout_width="300dp"
        android:layout_height="50dp"
        android:id="@+id/searchBar"
        android:layout_gravity="start|top"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginStart="20dp"
        android:background="#656565"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:inputType="text" />

    <Button
        android:id="@+id/timesButton"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_gravity="top|center"
        android:layout_marginTop="90dp"
        android:text="@string/times_button"
        android:onClick="onShowTimesButtonClick"/>

</FrameLayout>

TimeListFragment 是我的自定义ListFragment

import android.app.ListFragment;
import android.os.Bundle;
import android.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout.LayoutParams;

/**
 * A simple {@link Fragment} subclass.
 */
public class TimeListFragment extends ListFragment {

    public TimeListFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Temporary time data
        String[] times = new String[]{"1:00", "0:30", "0:45"};

        // Load the time data
        setListAdapter(new TimesListArrayAdapter(getActivity(), R.layout.layout_times_list_row, R.id.listText, times));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_times_list, container, false);

        LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        layoutParams.gravity = Gravity.BOTTOM;

        container.setLayoutParams(layoutParams);

        return view;
    }
}

TimeListFragment 的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"
    android:gravity="bottom">

    <ListView android:id= "@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:drawSelectorOnTop="false"/>

    <TextView android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="No data"/>
</LinearLayout>

【问题讨论】:

    标签: android android-layout android-fragments android-listfragment


    【解决方案1】:

    这是我目前所拥有的。我可以通过将重力设置为底部来将ListFragment 移动到屏幕底部。在 TimeListFragment 的 onCreateView 方法中,我将 layoutParams 应用于容器;根据 Android 文档,此容器是片段 UI 附加到的父视图。为了将layoutParams 应用于片段本身,我必须首先通过在膨胀视图上调用findViewById 来找到片段视图。

    onCreateView 的正确代码如下所示

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.layout_times_list, container, false);
    
            View fragmentView = view.findViewById(R.id.timesList);
    
            LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            layoutParams.gravity = Gravity.BOTTOM;
    
            fragmentView.setLayoutParams(layoutParams);
    
            return view;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2015-02-18
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多