在具有多个片段的活动之间滑动

时间:2015-03-23 07:44:25

标签: android android-layout android-fragments

当我阅读文档时,视图之间的滑动发生在片段之间。我正在开发一个应用程序作为活动< - >片段关系,即我可以在单个活动上有多个片段。我觉得这很明智,更容易理解。当我想用2个片段转换我现有的Activity以在另一个可能有多个片段的活动之间滑动时,我的问题出现了。我正在考虑碎片中的碎片,但我对这种方法不满意。我想知道在Android上是否有办法做到这一点?

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

感谢。

1 个答案:

答案 0 :(得分:0)

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

所以这是父片段的样子:

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中添加两个Child-Fragments的方法:

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>

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