[英]How to Open Fragment from MainActivity when Button is Clicked
I am having challenge implementing some buttons in MainActivity that when each is clicked, should take me to the Fragment Class, and i have other buttons that i want to set to start fragment activity.我在 MainActivity 中实现一些按钮时遇到了挑战,当每个按钮被单击时,应该将我带到 Fragment Class,并且我还有其他按钮要设置以启动片段活动。 Now these fragments are hosted on Tip4Activity with an adapter.
现在,这些片段通过适配器托管在 Tip4Activity 上。
My question is how can i create a button that when clicked should take me to Page1Fragment?我的问题是如何创建一个按钮,单击该按钮应将我带到 Page1Fragment? then with workable similar operation, i will be fine to create other buttons
然后通过可行的类似操作,我可以创建其他按钮
This is what i did in MainActivity.java这就是我在MainActivity.java中所做的
Tips3 = (Button)findViewById(R.id.mybtn1);
Tips3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Fragment fragment= new Page1Fragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
The button from activity_main.xml来自activity_main.xml的按钮
<Button android:id="@+id/mybtn1" style="?buttonBarButtonStyle" android:layout_width="300dp" android:layout_height="40dp" android:layout_marginTop="13dp" android:layout_weight="1" android:layout_gravity="center" android:text="The Preparation" android:textColor="#ffffff" android:textSize="17sp" android:textStyle="bold" />
This is my Page1Fragment.java这是我的Page1Fragment.java
private static final String TAG = "Page1Fragment ----- ; ";
// Store instance variables
private String title;
private int page;
private ConsentForm form;
//Store instance variables based on arguments passed
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
page = getArguments().getInt("SomeInt", 1);
title = getArguments().getString("someTitle");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_page1, container, false);
// set the html content for TextView
TextView newTextView = (TextView) v.findViewById(R.id.Tv1);
newTextView.setText(Html.fromHtml(getString(R.string.htmlFormattedText1)));
return v;
}
// newInstance constructor for creating fragments with arguments
public static Page1Fragment newInstance(int page, String title) {
Page1Fragment Page1Fragment = new Page1Fragment();
Bundle args = new Bundle();
args.putInt("someInt", page);
args.putString("someTitle", title);
Page1Fragment.setArguments(args);
return Page1Fragment;
}
}
This is the Activity hosting all the fragments with the aid of adapter tips_4.xml这是在适配器tips_4.xml的帮助下托管所有片段的活动
public class Tips_4 extends AppCompatActivity {
Toolbar toolbar;
TabLayout tabLayout;
ViewPager viewPager;
Button Tips3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tips_4);
//--------add click listener here ----------------------
Tips3 = (Button)findViewById(R.id.mybtn1);
Tips3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Fragment fragment= new Page1Fragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
toolbar= findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
ViewPager viewPager= (ViewPager) findViewById(R.id.view_pager);
viewPager.setAdapter(new SimpleFragmentPageAdapter(getSupportFragmentManager(),this));
//Attach the page change listener inside the activity
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
// This method will be invoked when a new page becomes selected
@Override
public void onPageSelected(int position) {
Toast.makeText(Tips_4.this, "Selected Fragment Page:" + position, Toast.LENGTH_SHORT).show();
}
// This method will be invoked when the current page is scrolled
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetpixels) {
}
// Called when the scroll state changes:
//SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING
@Override
public void onPageScrollStateChanged(int state) {
}
});
tabLayout= (TabLayout) findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(viewPager);
}
This is the Exception trace这是异常跟踪
--------- beginning of crash
2020-07-20 15:58:48.515 15613-15613/com.joseph.advancedmaths E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.joseph.advancedmaths, PID: 15613
java.lang.IllegalArgumentException: No view found for id 0x7f080067 (com.joseph.advancedmaths:id/container) for fragment Page1Fragment{8075d59 #0 id=0x7f080067}
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1454)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6549)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)
If you set the click listener after setContentView
in the onCreate
method of your activity, you should have no problem.如果您在活动的
onCreate
方法中的setContentView
之后设置点击侦听器,您应该没有问题。 You can even do it on the onCreatedView
method just in case.您甚至可以在
onCreatedView
方法上执行此操作以防万一。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tips_4);
//--------add click listener here ----------------------
Tips3 = (Button)findViewById(R.id.mybtn1);
Tips3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Fragment fragment= new Page1Fragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
toolbar= findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
ViewPager viewPager= (ViewPager) findViewById(R.id.view_pager);
viewPager.setAdapter(new SimpleFragmentPageAdapter(getSupportFragmentManager(),this));
//Attach the page change listener inside the activity
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
// This method will be invoked when a new page becomes selected
@Override
public void onPageSelected(int position) {
Toast.makeText(Tips_4.this, "Selected Fragment Page:" + position, Toast.LENGTH_SHORT).show();
}
// This method will be invoked when the current page is scrolled
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetpixels) {
}
// Called when the scroll state changes:
//SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING
@Override
public void onPageScrollStateChanged(int state) {
}
});
tabLayout= (TabLayout) findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(viewPager);
}
Try this and let me know how it works out.试试这个,让我知道它是如何工作的。
Well, it looks like the fragment is not showing because params are null.好吧,看起来片段没有显示,因为参数是 null。
public void onClick(View view) {
Fragment fragment = Page1Fragment.newInstance(1, "Hello");
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
Take a look at this instruction看看这个指令
Fragment fragment = Page1Fragment.newInstance(1, "Hello");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.