Android 在一个活动中的片段之间导航

Android 在一个活动中的片段之间导航,android,android-layout,android-intent,android-fragments,Android,Android Layout,Android Intent,Android Fragments,我想使用一个包含多个片段并在片段之间导航的活动。例如,在活动中,有一个列表视图是一个片段,当用户从列表中选择一个项目时,该视图将导航到另一个片段,如何实现 我知道开发者网站上有一个不错的界面,但它处理平板电脑屏幕,其中两个窗格布局,一个列表片段和一个详细片段显示在一个屏幕上。我只想在片段之间导航,而不想在一个屏幕上显示两个片段 有教程可以教我怎么做吗?简而言之,您的问题的答案是通知您的主机活动,然后让您的主机活动使用FragmentManager替换当前的片段容器 其中一种方法是在第一个片段中创

我想使用一个包含多个片段并在片段之间导航的活动。例如,在活动中,有一个列表视图是一个片段,当用户从列表中选择一个项目时,该视图将导航到另一个片段,如何实现

我知道开发者网站上有一个不错的界面,但它处理平板电脑屏幕,其中两个窗格布局,一个列表片段和一个详细片段显示在一个屏幕上。我只想在片段之间导航,而不想在一个屏幕上显示两个片段


有教程可以教我怎么做吗?

简而言之,您的问题的答案是通知您的主机活动,然后让您的主机活动使用FragmentManager替换当前的片段容器

其中一种方法是在第一个片段中创建一个接口,让主机活动注册/侦听(实现)到此接口,然后让FragmentManager在侦听器回调时用第二个片段替换容器内容

我不确定教程的内容,但以下是我的代码片段: 第一个片段

public class First extends Fragment{
private static onMySignalListener listener;

//call this function from whatever you like i.e button onClickListener
public void switchWindow() {
    if(listener != null){
        listener.onMySignal();
    }
}

public interface onMySignalListener {
    //customize this to your liking

    //plain without argument
    void onMySignal();

    //with argument
    void onMySignalWithNum(int mNum);
}

public static void setOnMySignalListener(onMySignalListener listener) {
    First.listener = listener;
}}
宿主活动

public class HostActivity extends FragmentActivity implements onMySignalListener{
private final String ADD_TAG_IF_NECESSARY = "mTag";

@Override
public void onCreate(Bundle ssi) {
    setContentLayout(R.layout.main);

    FirstFragment.setOnMySignalListener(this);
}

@Override
public void onMySignal() {
    //if you're using compat library
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();

    //initialize your second fragment
    sfragment = SecondFragment.newInstance(null);
    //replace your current container being most of the time as FrameLayout
    transaction.replace(R.id.container, fragment, ADD_TAG_IF_NECESSARY);
    transaction.commit();
}

@Override
public void onMySignalWithNum(int mNum) {
    //you can do the same like the above probably with your own customization
}}

这只是一个关于如何实现接口的示例,请自己整理一下。请注意,如果您有很多片段想要通知您的主机活动,那么这是无效的。这样做会使您实现各种侦听器到主机的活动。

我认为这对您很有用。这是一个屏幕中两个片段独立工作的示例

main活动

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        Fragment newFragment = new Test();
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.add(R.id.UprLayout, newFragment);
        // transaction.addToBackStack(null);
        transaction.commit();

        Fragment newFragment2 = new TestRight(); 
        FragmentTransaction transaction2 = getFragmentManager().beginTransaction();
        transaction2.add(R.id.dwnLayout, newFragment2);
        // transaction.addToBackStack(null);
        transaction2.commit();
    }
}
main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center|center_horizontal"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/UprLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical" />

    <LinearLayout
        android:id="@+id/dwnLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical" />

</LinearLayout>
<?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:gravity="center"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="test"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="50sp" />

</LinearLayout>
<?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:gravity="center"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test right"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="45sp" />

</LinearLayout>
<?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:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Right 2nd"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="50sp" />

</LinearLayout>
片段
TestRight

public class Test extends Fragment {
TextView tv;

@Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }

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

    }

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

        View view = inflater.inflate(R.layout.test, container, false);
        return view;        
    }
}
public class TestRight extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

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

    @Override
    public void onStart() {
        super.onStart();
        Button button = (Button)getActivity().findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Fragment newFragment = new Right2nd();
                FragmentTransaction transaction = getFragmentManager()
                        .beginTransaction();
                transaction.replace(R.id.dwnLayout, newFragment);
                transaction.addToBackStack("aa");
                transaction.commit();

                //transaction.add(R.id.frag, newFragment).commit();
            }
        });
    }
}
test.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center|center_horizontal"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/UprLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical" />

    <LinearLayout
        android:id="@+id/dwnLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical" />

</LinearLayout>
<?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:gravity="center"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="test"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="50sp" />

</LinearLayout>
<?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:gravity="center"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test right"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="45sp" />

</LinearLayout>
<?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:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Right 2nd"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="50sp" />

</LinearLayout>
片段
Right2nd

public class Right2nd extends Fragment{

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center|center_horizontal"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/UprLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical" />

    <LinearLayout
        android:id="@+id/dwnLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical" />

</LinearLayout>
<?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:gravity="center"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="test"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="50sp" />

</LinearLayout>
<?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:gravity="center"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test right"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="45sp" />

</LinearLayout>
<?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:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Right 2nd"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="50sp" />

</LinearLayout>

这是一个非常好的教程

我认为
ChildFragment

我会为你做这项工作。忽略选项卡ViewPager。它在多个选项卡中执行相同的操作。希望这能有所帮助。

我知道这是一个很老的问题,但这是目前在导航组件中实现的

但如果您只查看纵向布局,则该教程非常有效。@Warpzit,但教程要求我在纵向布局中创建两个活动,每个片段对应一个,不是吗?您好,如果我有很多片段(大约5个)想要通知我的主机活动,那么如何实现呢?我可以在主机活动中使用片段的onAttach()来设置侦听器,而不是使用自定义的set on方法吗?嗯,Android API中最复杂的通知系统是使用BroadcastReceiver。您可以使用该类替换传统的java接口/侦听器。在您的主机活动中注册一个接收者,从五个或更多片段中,您可以简单地发送广播。为了区分片段,可以使用sendBroadcast方法中发送的Intent。看看这个:可能谷歌上的一些例子,我不能在评论中发布我的例子,干杯。要解决最后一个问题,你应该使用ViewModel在片段和活动之间共享数据