从 ListFragment android 启动另一个 Fragment

Posted

技术标签:

【中文标题】从 ListFragment android 启动另一个 Fragment【英文标题】:Start another Fragment from ListFragment android 【发布时间】:2019-01-10 12:26:01 【问题描述】:

你能告诉我如何从一个列表片段LearnFragment开始另一个片段TrickFragment吗?

这是listfragment的代码:

public class LearnFragment extends ListFragment 
    int mCurCheckPosition = 0;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);

        setListAdapter(new ArrayAdapter<String>(getActivity(),
                R.layout.listview_item,R.id.TextBox, getResources().getStringArray(R.array.Titles)));
    

    @Override
    public void onSaveInstanceState(Bundle outState) 
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice", mCurCheckPosition);
    

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) 
        showDetails(position);
    

    void showDetails(int index) 
        mCurCheckPosition = index;

        getActivity().getSupportFragmentManager().beginTransaction()
                .replace(R.id.fg_learn, new TrickFragment())
                .commit();
    

这是它的xml(我认为它不会被执行)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:id="@+id/fg_learn"
    tools:context=".LearnFragment">

</FrameLayout>

TrickFragment

public class TrickFragment extends Fragment 

    public TrickFragment() 
        // Required empty public constructor
    

    public static TrickFragment newInstance(int index) 
        TrickFragment fragment = new TrickFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        fragment.setArguments(args);
        return fragment;
    

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

    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 

        View view =inflater.inflate(R.layout.fragment_trick, container, false);
        return view;
    

及其xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fg_trick"
    android:layout_
    android:layout_
    tools:context=".TrickFragment">

    <TextView
        android:layout_
        android:layout_
        android:id="@+id/fg_trick_textview"/>

</LinearLayout>

我提到我有一个名为 listview_item 的列表视图项(如果重要的话)

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".PlayFragment">

    <TextView
        android:layout_
        android:layout_
        android:id="@+id/TextBox"/>

</FrameLayout>

【问题讨论】:

能否添加activity_layout.xml 我在评论中添加了 【参考方案1】:

使用这个:

getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fg_learn, TrickFragment.newInstance(index))
                        .commit();

【讨论】:

【参考方案2】:

MainActivity

 public class MainActivity extends AppCompatActivity 

   @Override
    protected void onCreate(Bundle savedInstanceState) 
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      updateContainerFrame(new LearnFragment()); // show ListFragment.
    

    public void updateContainerFrame(Fragment fragment)
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container_frame, fragment)
                .commit();
    
  

LearnFragment

    public class LearnFragment extends ListFragment 
        int mCurCheckPosition = 0;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) 
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                    inflater.getContext(), android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.Titles));
            setListAdapter(adapter);
            return super.onCreateView(inflater, container, savedInstanceState);
        

        private void showDetails(int index) 
            mCurCheckPosition = index;
            if (getActivity() instanceof MainActivity)
                ((MainActivity) getActivity()).updateContainerFrame(TrickFragment.newInstance(index));
        
     

TrickFragment

    public class TrickFragment extends Fragment 

        public TrickFragment() 
            // Required empty public constructor
        

        public static TrickFragment newInstance(int index) 
            TrickFragment fragment = new TrickFragment();
            Bundle args = new Bundle();
            args.putInt("index", index);
            fragment.setArguments(args);
            return fragment;
        
    

activity_main.xml

<!--ViewPager -->
<!--<android.support.v4.view.ViewPager-->
    <!--android:layout_-->
    <!--android:layout_-->
    <!--android:id="@+id/view_pager"/>-->

<!--Use frame container instead of ViewPager-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:id="@+id/container_frame"
    tools:context=".MainActivity"/>

Github 上的完整示例。

【讨论】:

java.lang.IllegalArgumentException:未找到片段 TrickFragment1fc6342d #2 id=0x7f090051 的 id 0x7f090051 (studio.pinbu.learnmath:id/fg_learn) 的视图 W/art:在 Android 4.1 之前,方法 int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) 会错误地覆盖 android.widget.ListView 中的包私有方法 我认为我不能使用替换,因为没有要替换的 xml,我生成列表视图... 检查我的答案更新,顺便说一句,当您需要添加额外信息时,请编辑您的问题并且不要将其添加为答案。

以上是关于从 ListFragment android 启动另一个 Fragment的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 中的 ListFragment

使用 SQLite 的 Android 简单 ListFragment

Android开发笔记(13)——ListFragment

ScrollView Android 中的 ListFragment

Android ListFragment 游标管理

Android:无法让 Checkbox OnClickListener 在 ListFragment 中工作