繁体   English   中英

在活动与多个片段之间滑动

[英]Sliding between activity with multiple fragments

在阅读文档时,片段之间会在视图之间滑动。 我正在将应用程序开发为Activity <-> Fragment关系,也就是说,我可以在一个Activity上包含多个片段。 我觉得这很明智,也更容易理解。 当我想将现有的带有2个片段的Activity转换为可能有多个片段的另一个Activity之间滑动时,就会出现我的问题。 我正在考虑“片段中的片段”,但是我对这种方法不满意。 我想知道是否可以在Android上执行此操作吗?

第二件事是,所有教程都指向一个片段,其中包含用于查看数据的占位符。 这样很容易实现。 但是我不是通过某种数据源进行分页,而是通过活动进行分页。 我需要某种方式在两个活动之间进行可靠的通信,以便ActivityB将数据发送到ActivityA。 尽管我没有实施很多活动来完成,但是只有两项活动。 我目前正在按照文档中的描述实施代码,但似乎这不是我想要的。 我看到一些做类似事情的应用程序,我也想要类似的功能。 有任何想法吗?

谢谢。

我现在有解决方案。 我所做的是创建了一个片段,它将添加2个子片段。 这两个子片段具有List和Filter片段。 而不是通过活动来完成,而是通过片段来完成。 如果有人遇到类似问题:

因此,这是“父片段”的样子:

package com.neonwarge.android.note;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;

public class PagerActivity extends BackboneActivity implements     NoteListSubFragment.NoteListCallback
{
private final static int NUM_PAGES = 2;
private ViewPager mPager;
private PagerAdapter mPagerAdapter;
private int mCurrentPage;

private HomePageFragment mHomePageFragment;
private NoteDateSelectorFragment mNoteDateSelectorFragment;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    Log.i(NoteApplication.TAG, "PagerActivity.onCreate() has been called.");
    setTargetLayout(R.layout.activity_pager);

    mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
    mPager = (ViewPager) findViewById(R.id.activity_home_screen_pager);
    mPager.setAdapter(mPagerAdapter);

    mCurrentPage = 0;
    mPager.setCurrentItem(mCurrentPage);
}

private class PagerAdapter extends FragmentStatePagerAdapter
{
    public PagerAdapter(FragmentManager fm)
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
        switch(position)
        {
            case 0:
                mHomePageFragment = new HomePageFragment();
                return mHomePageFragment;

            case 1:
                mNoteDateSelectorFragment = new NoteDateSelectorFragment();
                return mNoteDateSelectorFragment;

            default: break;
        }

        return null;
    }

    @Override
    public int getCount()
    {
        return NUM_PAGES;
    }
}


@Override
public void onNoteItemSelected(Note note , int type)
{
    Intent intent = new Intent(this , NoteActivity.class);
    intent.putExtra(NoteFragment.EXTRA_NOTE_ID, note.getNoteID());
    intent.putExtra(NoteFragment.EXTRA_INSTANCE_TYPE, type);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivityForResult(intent , 0);
}

@Override
public void onActivityResult(int request, int result, Intent intent)
{
    super.onActivityResult(request, result, intent);

    Log.i(NoteApplication.TAG, "PageActivity.onActivityResult() called.");

    if(intent == null)
        return;

    switch(mCurrentPage)
    {
        case 0:
            mHomePageFragment.updateSubFragments(request, result, intent);
            break;

        case 1:
            break;

        default:
            Log.i(NoteApplication.TAG, "PagerActivity.onActivityResult(): page not supported.");
            break;
    }
}
}

在这里注意到,我想拥有的两个片段(最初由活动添加)现在被封装到名为HomePageFragment的父片段中。

这是我在HomePageFragment中添加两个子片段的方法:

public class HomePageFragment extends Fragment
{
private NoteListSubFragment mNoteListSubFragment;
private NoteFilterSubFragment mNoteFilterSubFragment;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    setRetainInstance(true);

    View v = inflater.inflate(R.layout.fragment_homescreen, container, false);

    // add sub_fragments here.
    FragmentManager cfm = getChildFragmentManager();
    FragmentTransaction cft = cfm.beginTransaction();

    mNoteListSubFragment = new NoteListSubFragment();
    mNoteFilterSubFragment = new NoteFilterSubFragment();

    cft.add(R.id.layout_fragment_container_filter, mNoteFilterSubFragment);
    cft.add(R.id.layout_fragment_container_list, mNoteListSubFragment);
    cft.commit();

    return v;
}

public void updateSubFragments(int request, int result, Intent intent)
{
     if(mNoteListSubFragment != null)
         mNoteListSubFragment.onNoteListUpdated();  
}

}

如您在这两行中所见:

        cft.add(R.id.layout_fragment_container_filter, mNoteFilterSubFragment);
    cft.add(R.id.layout_fragment_container_list, mNoteListSubFragment);

这实际上是针对此片段将出现在其上的FrameLayout。 最初,我只是简单地重用了Activity的布局文件,并将片段膨胀到各自的位置:

<?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"
android:baselineAligned="false"
android:padding="7dp">

<FrameLayout         
    android:id="@+id/layout_fragment_container_filter"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

<FrameLayout         
    android:id="@+id/layout_fragment_container_list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="30"/>

</LinearLayout>

我希望这会对某人有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM