【问题标题】:How to add a fragment in my activity dynamically?如何在我的活动中动态添加片段?
【发布时间】:2015-07-15 08:49:26
【问题描述】:

我正在使用 Android Studio,它实现了片段类的所有功能。我收到以下运行时异常:

must implement OnFragmentInteractionListener

这是我的代码,我在主要活动中实现了OnFragmentInteractionListener

主要活动:

public class MainActivity extends FragmentActivity implements BlankFragment.OnFragmentInteractionListener {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (findViewById(R.id.fragment_container) != null) {
            BlankFragment fragment = new BlankFragment();
            android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
            android.support.v4.app.FragmentTransaction ft = manager.beginTransaction();
            ft.add(R.id.fragment_container, fragment).commit();
        }
    @Override            
    public void onFragmentInteraction(Uri uri) {}

}

空白片段:

public class BlankFragment extends android.support.v4.app.Fragment {
    private OnFragmentInteractionListener mListener;
    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(Uri uri);
    }

    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }
}

fragment class 和 main Activity 的其余方法也是默认实现的。我还在 main_activity.xmlfile and also assignedandroid:id` 中将 LinearLayoutFrameLayout 更改为引用良好的它。我的代码有什么问题?

【问题讨论】:

  • 你用activity初始化了mListener这个接口的对象吗??
  • 你是在BlankFragment还是android.app.Fragment中使用android.support.v4.app.Fragment作为基类?
  • 您的代码不清楚。请重新粘贴两个类(活动和片段)
  • 不,我还没有在主活动中初始化 mlistener 对象。
  • 我在 Blank Fragment 中使用 android.support.v4.aoo.Fragment 作为基类。

标签: java android android-layout android-fragments


【解决方案1】:

要与您的BlankFragment 对象进行交互,我将使用Android Support Docs 中推荐的以下方法 - 我相信这是您想要实现的目标,并且适合您的BlankFragment 对象托管MainActivity:

public class MainActivity extends FragmentActivity implements BlankFragment.OnFragmentInteractionListener    {

private BlankFragment fragment = null;
private android.support.v4.app.FragmentManager manager = null;
private android.support.v4.app.FragmentTransaction ft;

public void onFragmentInteraction(Uri uri){
        Log.i("Tag", "onFragmentInteraction called");
    }

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (manager == null) manager = getSupportFragmentManager();            

    if(manager.findFragmentById(R.id.fragment_container) == null) {

        //If a fragment is not already loaded into your container, then add one...

        fragment = new BlankFragment();
        ft= manager.beginTransaction();
        ft.add(R.id.fragment_container,fragment).commit();
    }
}

为了与您的片段进行通信,您需要执行以下操作:

if(fragment == null) {
    fragment = (BlankFragment) manager.findFragmentById(R.id.fragment_container);
}

然后您可以调用与fragment 关联的任何方法

如果是相反的方式(从片段到活动的通信),那么您需要在BlankFragment 中执行以下操作,以形成与父级Activity 的链接:

//Class variable...
OnFragmentInteractionListener mCallback;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mCallback = (OnFragmentInteractionListener) activity;
            } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnFragmentInteractionListener");
        }
    }

您可能忘记了最后一步,这可以解释您的错误。然后你会使用:

mCallback.onFragmentInteraction(uri);

MainActivity交流

【讨论】:

  • 我一周前刚开始学java。我当然不理解空白活动中的很多代码。我只想显示一个片段布局的文本框。此代码默认由 android studio 实现。 public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri);没有按钮附加到 fragment.xml 我不明白这个自动生成的片段。
  • @user3859323 它是由 Android Studio 创建的示例项目吗?如果是这样,您是如何创建它的?我会把它复制到最后并看看。
  • 不,这不是一个示例项目。当我单击我的应用程序并添加一个片段时,我选择了 blankFragment 并生成了它的 java 和 xml。创建一个项目并向您的活动添加一个空白片段,这就是我尝试做的所有事情。
  • 它自己工作。我添加了一个视图,然后将其删除,它起作用了:D
  • @user3859323 太好了!对于它的价值,我按照您采取的步骤创建了一个演示片段/活动通信的工作示例。如果您愿意,您可以自己下载、编辑和运行它等。它可能对您的学习有所帮助,因为这可能是一个复杂的话题。获取它的链接在我的 GitHub 页面上:github.com/PPartisan/FragmentInterfaceExample 只需下载 zip 文件并在 Android Studio 中打开即可
【解决方案2】:

这对我有用,我只是在这里分享,你永远不知道它会帮助其他人。

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();

只有一行代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多