我正在尝试做的是仅将一个Activity用作许多片段的主机,例如该活动一次只能容纳一个片段,并且片段应按一定顺序附加到该活动。
我的片段代码:

public class FirstFragment extends Fragment{

    //some code here to instantiate FirstFragment here.

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.main, container, false);
    Button button = (Button) view.findViewById(R.id.button1);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((MainActivity) getActivity()).onFirstFragmentFinished(position);
        }
    });
    return view;
}

    // Container Activity must implement this interface
    public interface FirstFragmentListener {
        public void onFirstFragmentFinished(int position);
    }
}


简而言之,在每个片段中我都有一个按钮,当按下它时,它将获得主机活动并调用FirstFragmentListener接口的已实现方法。

public class MainActivity extends AppCompatActivity implements FirstFragmentListener {

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

       FragmentManager fragmentManager =  getSupportFragmentManager();
       FragmentTransaction fragmentTra = fragmentManager.beginTransaction();
       fragmentTra .replace(R.id.main_layout, new FirstFragment());
       fragmentTra.commit();
    }

    @Override
    public void onFirstFragmentFinished(int position)
    {
        if(position == 1)
        {
            FragmentManager fragmentManager =  getSupportFragmentManager();
            FragmentTransaction fragmentTra = fragmentManager.beginTransaction();
            fragmentTra .replace(R.id.main_layout, new SecondFragment());
            fragmentTra.commit();
        }
    }
}


创建活动后,请始终用FirstFragment布局替换该活动中的所有内容。
当FirstFragment完成工作并按下该片段上的按钮时,它将在此活动中调用FirstFragment接口的已实现方法,然后检查该位置的某个值,如果条件正确,则将FirstFragment替换为SecondFragment实例。
调用commit()方法时,应用程序崩溃。

最佳答案

使用onFirstFragmentFinished是错误的。查看官方文档:
android-comunication-activity-ffragment

最好是重写onAttach()方法。

10-08 19:17