在Android中,如何通过单击ImageView从一个片段移动到另一个片段?

27
我有一个ImageView。当点击ImageView时,我想要像从一个活动到另一个活动一样,从一个片段移动到另一个片段。
Intent i=new Intent(MainActivity.this,SecondActivity.class);
startActivity(i);

这句话的意思是:“我该怎么做?有人能够逐步解释给我吗?”
“我的代码如下:”

mycontacts.class

public class mycontacts extends Fragment {
    public mycontacts() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        final View v = super.getView(position, convertView, parent);
        ImageView purple=(ImageView)v.findViewById(R.id.imageView1);
        purple.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
            // TODO Auto-generated method stub
            //how to go to tasks fragment from here???
            }
        });
        return view;

    } 
}

tasks.class

public class tasks extends Fragment {
    public tasks() { 
    }

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

        View view = inflater.inflate(R.layout.fragment_layout_one, container,
            false);

        return view;
    }
}
11个回答

73
purple.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Fragment fragment = new tasks();
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.content_frame, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
});

您编写了上述代码...在这里,我们将R.id.content_frame替换为我们的片段。


片段 fragment = new tasks(); 我得到了错误“无法将片段转换为任务”。该怎么办? - anu_r
2
任务扩展片段...所以任务只是片段的子类,并确保您的导入语句如下:import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction;如果仍然出现错误,请发布您的日志消息。 - GvSharma
1
任务片段具有布局ID r.id.task。而我的当前片段具有布局ID r.id.contact。那么我应该在 r.id.content_frame 的位置写什么? - anu_r
好的,你现在在MyContacts片段中了吗?那你该如何开始呢?检查一下,你可能会通过替换视图从某个地方调用到MyContacts片段。所以在这里,你也需要提到相同的视图。希望这能帮到你。 - GvSharma
哦,我搜索了多久才找到答案!谢谢!刚开始,变量名tasks(?!)让人困惑。然后他随口提到他称呼他的代码片段为tasks!=) - gevaraweb
显示剩余2条评论

3
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_profile, container, false);
    notification = (ImageView)v.findViewById(R.id.notification);

    notification.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FragmentTransaction fr = getFragmentManager().beginTransaction();
            fr.replace(R.id.container,new NotificationFragment());
            fr.commit();
        }
    });

    return v;
}

3
在你想要点击和加载片段的地方添加此代码。

Fragment fragment = new yourfragment();
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

2
当您在Activity内部并且需要进入一个Fragment时,请使用以下代码: getFragmentManager().beginTransaction().replace(R.id.*TO_BE_REPLACED_LAYOUT_ID*, new tasks()).commit(); 但是当您在Fragment内部并且需要进入另一个Fragment时,只需在前面添加getActivity().,代码将变为: getActivity().getFragmentManager().beginTransaction().replace(R.id.*TO_BE_REPLACED_LAYOUT_ID*, new tasks()).commit(); 就这么简单。 *TO_BE_REPLACED_LAYOUT_ID*可以是整个Activity页面或其中的一部分,只需确保为要替换的布局放置一个ID即可。通常将可替换的布局放在FrameLayout中。

1
在您的 onClickListener.onClick 中,输入 < /p>。
getFragmentManager().beginTransaction().replace(R.id.container, new tasks()).commit();

在另一个词中,在你的 mycontacts.class 中。
public class mycontacts extends Fragment {

    public mycontacts() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View v = super.getView(position, convertView, parent);
        ImageView purple = (ImageView) v.findViewById(R.id.imageView1);
        purple.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                getFragmentManager()
                        .beginTransaction()
                        .replace(R.id.container, new tasks())
                        .commit();
            }
        });
        return view;

    }
}

现在,请记住R.id.container是调用片段的活动的容器(FrameLayout或其他布局)。

1

您可以使用FragmentManager事务来移动到另一个片段。片段不能像活动一样被调用,它们存在于活动的存在之下。

您可以通过编写以下代码来调用另一个片段:

FragmentTransaction t = this.getFragmentManager().beginTransaction();
Fragment mFrag = new MyFragment();
t.replace(R.id.content_frame, mFrag);
t.commit();

这里的 "R.id.content_frame" 是您想要替换片段的布局的 ID。

如果需要替换,您还可以添加其他片段。


碎片 fragment = new tasks(); 我得到了错误,无法将碎片转换为任务。该怎么办? - anu_r
请检查导入项,使用supportedFragment或Fragments。 - Ashok Singhal
1
询问片段具有布局ID r.id.task。而我的当前片段具有布局ID r.id.contact。那么我应该在r.id.content_frame的位置写什么? - anu_r

0
在 Kotlin 中,将以下代码放入当前正在运行的 Fragment 中:button.setOnClickListener。
    val bpfragment = TwoFragment()
    activity?.supportFragmentManager?.beginTransaction()?.replace(R.id.fragment_container, bpfragment)?.commit()

0
            val fragment = YourFragment3()
            val fm : FragmentManager= requireActivity().supportFragmentManager
            val ft: FragmentTransaction = fm.beginTransaction()
            ft.replace(R.id.container, fragment)
            ft.commit()
            (activity as MainActivity).binding.viewPager.setCurrentItem(2)

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0
private boolean loadFragment(Fragment fragment) {
        if (fragment != null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.fl_fragment_container, fragment)
                    .commit();
            return true;
        }
        return false;
    }

0
如果你正在寻找上述代码的Kotlin版本,你可以这样做,并且在onClickListener或任何你想要的地方调用replaceFragment(RequiredFragment())
private fun replaceFragment(fragment: Fragment) {
val transaction = activity!!.supportFragmentManager.beginTransaction()
transaction.replace(R.id.frame, fragment)
transaction.commit()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接