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

Lee*_*fin 8 android android-intent android-layout android-fragments

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

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

是否有教程可以教我如何做到这一点?

Ray*_*nda 11

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

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

我不确定教程,但这是我的片段:First Fragment

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;
}}
Run Code Online (Sandbox Code Playgroud)

主机活动

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
}}
Run Code Online (Sandbox Code Playgroud)

这只是一个关于如何实现界面的例子,请自己整理一下.请注意,如果您有很多片段想要通知您的主机活动,这是无效的.这样做会引导您实现对主机活动的各种监听.


Thu*_*ara 5

我认为这对你有用.它是一个屏幕中两个片段独立工作的示例.

MainActivity :

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

片段Test:

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;        
    }
}
Run Code Online (Sandbox Code Playgroud)

片段TestRight:

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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

test.xml :

<?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>
Run Code Online (Sandbox Code Playgroud)

test_right.xml :

<?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>
Run Code Online (Sandbox Code Playgroud)

片段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;
    }
}
Run Code Online (Sandbox Code Playgroud)

right_2nd.xml :

<?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>
Run Code Online (Sandbox Code Playgroud)