我正在创建一个应用,其中需要在片段的小部件上侦听点击事件。 在我的应用程序: 我将我的活动的默认片段设置为fragmentOne,我想在有人点击fragmentOne中的小部件时更改活动片段我想将片段活动从fragmentOne更改为fragmentTwo。 这是我的主要活动xml代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wordpress.tbkj.app_name.LoginSignupActivity">
<fragment
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/login_signup_fragment"
android:name="com.wordpress.tbkj.app_name.LoginFragment"
tools:layout="@layout/fragment_login" />
</RelativeLayout>
这是我的活动代码:
public class LoginSignupActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_signup);
}
}
当我启动此活动时,fragmenOne可见。 如果有人想要其他代码,请发表评论。
答案 0 :(得分:1)
您应该定义活动实现的接口。例如:
public interface CoolFragmentListener {
void someCoolWidgetActionClicked();
}
public class LoginSignupActivity extends AppCompatActivity implements CoolFragmentListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_signup);
}
public void someCoolWidgetActionClicked() {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// Use the new instance pattern instead of directly instantiating your fragment.
YourNewCoolFragment fragment = YourNewCoolFragment.newInstance();
fragmentTransaction.add(R.id.container, fragment);
fragmentTransaction.commit();
}
}
在片段中,您将拥有一个实现“CoolFragmentListener”接口的对象。这通常在onAttach生命周期中完成。
public class YourNewCoolFragment extends Fragment {
private CoolFragmentListener listener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceOf CoolFragmentListener) {
// context in this case is your activity, which implements CoolFragmentListener
listener = (CoolFragmentListener) context;
}
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_coolstuff, container, false);
// Assuming that your fragment has a Button with the id R.id.button
Button button = (Button) view.findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.someCoolWidgetActionClicked();
}
}
});
return view;
}
}
还有一件事,不是将您的片段嵌入您共享的代码中的活动布局中,而是应该有一个容器视图,FragmentManager可以将您的新片段添加到其中。例如:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wordpress.tbkj.app_name.LoginSignupActivity">
<FrameLayout
android:id="@+id/container"
android:layout_height="match_parent"
android:layout_width="match_parent"
/>
</RelativeLayout>
这意味着您还必须以编程方式添加第一个片段。
答案 1 :(得分:0)
https://developer.android.com/guide/components/fragments.html有一个很好的描述。在我看来,片段的转换在下面有详细描述:
在您的活动运行的任何时候,您都可以在活动布局中添加片段。您只需指定一个ViewGroup来放置片段。 要在活动中创建片段事务(例如添加,删除或替换片段),必须使用FragmentTransaction中的API。您可以从Activity中获取FragmentTransaction的实例,如下所示:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction
=fragmentManager.beginTransaction();
然后,您可以使用add()方法添加片段,指定要添加的片段以及要插入的视图。例如:
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
传递给add()的第一个参数是应放置片段的ViewGroup,由资源ID指定,第二个参数是要添加的片段。