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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 19:31:31  来源:igfitidea点击:

Android How to call Fragment from my Main Activity

javaandroidandroid-fragments

提问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 按钮仍然可见。我怎样才能隐藏按钮

Fragment

分段

采纳答案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();