Java Android 如何从我的主要活动中调用 Fragment
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/37653037/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android How to call Fragment from my Main Activity
提问by bentech4u
i am very new to android development.
我对android开发很陌生。
in my case i have one main activity and one fragment created.Main activity as two buttons.
就我而言,我创建了一个主要活动和一个片段。主要活动作为两个按钮。
when i click on button, my fragment should load .how can i achieve that?
当我点击按钮时,我的片段应该加载。我怎样才能做到这一点?
Mainactivity .XML
主要活动.XML
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment 2"
android:id="@+id/fragment_button_2"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment 1"
android:id="@+id/fragment_button_1"
android:layout_above="@+id/fragment_button_2"
android:layout_alignLeft="@+id/fragment_button_2"
android:layout_alignStart="@+id/fragment_button_2"
android:layout_marginBottom="33dp" />
</RelativeLayout>
Main activity .java
主要活动.java
package com.bentgeorge.fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button fragment_btn_1;
private Button fragment_btn_2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragment_btn_1 = (Button) findViewById(R.id.fragment_button_1);
fragment_btn_2 = (Button) findViewById(R.id.fragment_button_2);
}
@Override
public void onClick(View v) {
Fragment1 frag = new Fragment1();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.mainlayout,frag,"Test Fragment");
transaction.commit();
}
}
fragment_fragment1.xml
fragment_fragment1.xml
<FrameLayout 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.bentgeorge.fragment.Fragment1">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
Fragment1.java
片段1.java
package com.bentgeorge.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A simple {@link Fragment} subclass.
*/
public class Fragment1 extends Fragment {
public Fragment1() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_fragment1, container, false);
}
}
Not done much codes as i am confused with internet available tutorials.
没有做太多代码,因为我对互联网上可用的教程感到困惑。
Please help me to fix this
请帮我解决这个问题
Thanks & Regards,
感谢和问候,
Update:
更新:
i have done some changes and my fragment is getting loaded now. ut the buttons are still visible . How can i hide the buttons
我做了一些更改,我的片段现在正在加载。ut 按钮仍然可见。我怎样才能隐藏按钮
采纳答案by RIJO RV
Updated:Please change your MainActivity as like this:
更新:请像这样更改您的 MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment fragment = new MainFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
}
}
Change your activity_main.xml as like this:
像这样更改您的activity_main.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Please create an xml fragment_main.xml:
请创建一个 xml fragment_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment 2"
android:id="@+id/fragment_button_2"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment 1"
android:id="@+id/fragment_button_1"
android:layout_above="@+id/fragment_button_2"
android:layout_alignLeft="@+id/fragment_button_2"
android:layout_alignStart="@+id/fragment_button_2"
android:layout_marginBottom="33dp" />
</RelativeLayout>
Also create a fragment as MainFragment:
还要创建一个片段作为 MainFragment:
public class MainFragment extends Fragment implements View.OnClickListener{
private Button fragment_btn_1;
private Button fragment_btn_2;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
fragment_btn_1 = (Button) view.findViewById(R.id.fragment_button_1);
fragment_btn_2 = (Button) view.findViewById(R.id.fragment_button_2);
fragment_btn_1.setOnClickListener(this);
fragment_btn_2.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.fragment_button_1:
Fragment fragment1 = new Fragment1();
moveToFragment(fragment1);
break;
case R.id.fragment_button_2:
Fragment fragment2 = new Fragment2();
moveToFragment(fragment2);
break;
}
}
private void moveToFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
}
}
Hope this will helps you. If you had any queries, let me know.
希望这会帮助你。如果您有任何疑问,请告诉我。
回答by El.
in you onClick() method -
在你的 onClick() 方法中 -
if(v.getId()==R.id.fragment_button_1){
getActivity().getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_frame, new Fragment1(), "createPost").addToBackStack(null).commit();
}
where R.id.fragment_frame - rootContainer Id rootView in MainActivity.java
其中 R.id.fragment_frame - MainActivity.java 中的 rootContainer Id rootView
you should use Framelayout for placing fragment in activity.
您应该使用 Framelayout 在活动中放置片段。
like below - activity_layout.xml -
像下面 - activity_layout.xml -
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.myapplication.Activities.TestActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="40dp"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Button 1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/button1"
android:layout_centerHorizontal="true"
android:text="Button 1" />
</LinearLayout>
</FrameLayout>
and your activity - MainActivity.java
和您的活动 - MainActivity.java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class TestActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_test, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.button1){
getSupportFragmentManager().beginTransaction().
replace(R.id.root_layout, new Fragment1()).commit();
}
}
}
btw your fragment looks good. hope it will help you.
顺便说一句,您的片段看起来不错。希望它会帮助你。
回答by Sathish Kumar J
You can't call Fragments via Intent. Fragment is a part of an FragmentActivity.
你不能通过 Intent 调用 Fragments。Fragment 是 FragmentActivity 的一部分。
All in all Fragment is a content not container, so you need to create a FragmentActivity and add Fragment(Fragment1) in that, and then call on your onClick(),
总之,Fragment 是一个内容而不是容器,因此您需要创建一个 FragmentActivity 并在其中添加 Fragment(Fragment1),然后调用您的 onClick(),
Intent intent = new Intent(MainActivity.this, SomeFragmentActivity.class);
startActivity(intent);
More info : here
更多信息:这里
回答by J Whitfield
use getActivity() from the fragment to access activity functions. If you want to access functions specific to your own activity class. Cast the acticity object you get first before using it see example below
使用片段中的 getActivity() 访问活动函数。如果您想访问特定于您自己的活动类的功能。在使用它之前先投射您首先获得的活动对象,请参见下面的示例
MyActivityClass myActivity = (MyActivityClass) getActivity();
回答by WritingForAnroid
Create one more activity say ExampleFragmentActivity.class, and include fragment tag in ExampleFragmentActivity's layout within Framelayout.
再创建一个活动,比如 ExampleFragmentActivity.class,并在 Framelayout 的 ExampleFragmentActivity 的布局中包含片段标记。
public class ExampleFragmentActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.example_feagment_activity);
}
}
example_fragment_activity.xml(modified)
example_fragment_activity.xml(修改)
<FrameLayout 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.bentgeorge.fragment.Fragment1">
<fragment
android:id="@+id/titles"
class="com.bentgeorge.fragment.Fragment1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
In Onclick method of your MainAcitivity.class
在 MainAcitivity.class 的 Onclick 方法中
Intent intent = new Intent(MainAcitivity.this,ExampleFragmentActivity.class);
You can also include fragment dynamically using fragment manager.
您还可以使用片段管理器动态包含片段。
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
fragmentTransaction.add(R.id.fragment_container, fragment1, "fragment");
fragmentTransaction.commit();
回答by Brinda Rathod
FragmentTransaction fragmenttransaction = getSupportFragmentManager().beginTransaction();
HomeFragment regcomplainfragment = new HomeFragment();
fragmenttransaction.replace(R.id.content_frame, regcomplainfragment).addToBackStack("HomeFragment");
fragmenttransaction.commit();