Android Как позвонить на фрагмент из моей основной деятельности

Я очень новичок в разработке Android.

в моем случае у меня есть одно основное действие и один созданный фрагмент. Основное действие как две кнопки.

когда я нажимаю на кнопку, мой фрагмент должен загрузиться. Как я могу добиться этого?

Mainacctivity .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>

Основная деятельность .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

<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

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);
}

}

Не сделано много кодов, так как я запутался с доступными в Интернете учебниками.

Пожалуйста, помогите мне исправить это

С уважением,

Обновить:

Я сделал некоторые изменения, и мой фрагмент загружается сейчас. но кнопки все еще видны. Как я могу скрыть кнопки

Ответы на вопрос(6)

тью FragmentActivity.

В целом Fragment - это содержимое, а не контейнер, поэтому вам нужно создать FragmentActivity и добавить в него Fragment (Fragment1), а затем вызвать onClick (),

Intent intent = new Intent(MainActivity.this, SomeFragmentActivity.class);
startActivity(intent);

Больше информации :Вот

сти. Если вы хотите получить доступ к функциям, специфичным для вашего собственного класса активности. Примените объект acticity, который вы получили первым, прежде чем использовать его, см. Пример ниже.

MyActivityClass myActivity = (MyActivityClass) getActivity();

скажем, ExampleFragmentActivity.class, и включите тег фрагмента в макет ExampleFragmentActivity в Framelayout.

public class ExampleFragmentActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.example_feagment_activity);
    }
}

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>

В методе Onclick вашего MainAcitivity.class

Intent intent = new Intent(MainAcitivity.this,ExampleFragmentActivity.class);

Вы также можете включить фрагмент динамически, используя менеджер фрагментов.

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
fragmentTransaction.add(R.id.fragment_container, fragment1, "fragment");
fragmentTransaction.commit();
Решение Вопроса

Обновлено: Пожалуйста, измените вашу MainActivity следующим образом:

  
        @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, fragme,nt, fragment.getClass().getSimpleName()).addToBackStack(null).commit();

        }
    }

Измените ваш 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" />

Пожалуйста, создайте фрагмент XML_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>

Также создайте фрагмент как 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();

        }
}

Надеюсь, это поможет вам. Если у вас есть какие-либо вопросы, дайте мне знать.

 RIJO RV07 июн. 2016 г., 08:20
Пожалуйста, проверьте мой обновленный ответ.
 RIJO RV06 июн. 2016 г., 12:06
Вместо того, чтобы создавать новый xml, попробуйте указать этот идентификатор для основного макета действия.
 RIJO RV07 июн. 2016 г., 08:05
пожалуйста, дайте немного цвета фона для фрагмента. Иначе вам нужно сделать кнопки, отображающие экран как отдельный фрагмент
 RIJO RV06 июн. 2016 г., 15:04
пожалуйста, напишите moveToFragment () так, как я вам дал. Вам не нужен этот фрагмент. XML. Вместо этого, пожалуйста, делайте, как мой отредактированный ответ. То есть, пожалуйста, укажите идентификатор вашей RelativeLayout в activity_main.xml в качестве frag_frame.
 bentech4u06 июн. 2016 г., 11:40
я создал новый макет и макет XML здесьpaste.fedoraproject.org/375300/05995146
 bentech4u06 июн. 2016 г., 15:52
Я сделал все изменения, как и я, как ты. но вот результат. Фрагмент становится накладным, а кнопка не скрывается.s33.postimg.org/9t7pp455b/Screenshot_2016_06_06_16_49_54.png
 Fernando Urban22 апр. 2019 г., 04:41
getSupportFragmentManager не существует
 bentech4u06 июн. 2016 г., 11:39
программа закрывается, и в IDe я получил сообщение об ошибке типа «java.lang.IllegalArgumentException: не найдено представление для идентификатора 0x7f0c0053 (com.bentgeorge.fragment: id / фрагмент_layout) для фрагмента Fragment1 {148dff74 # 0 id = 0x7f0c0053}»
 RIJO RV06 июн. 2016 г., 15:10
ИЛИ в moveToFragment () измените R.id.fragment_frame на R.id.mainlayout. Сделайте любой из них.
 bentech4u06 июн. 2016 г., 12:26
MainActivity.java:paste.fedoraproject.org/375310/65208598  activity_main.xml:paste.fedoraproject.org/375312/14652086  Fragment1.java:paste.fedoraproject.org/375313/52086701  фрагмент_фрагмента1.xml:paste.fedoraproject.org/375315/65208704  фрагмент.xml:paste.fedoraproject.org/375316/14652087    Это мой текущий код, и я слишком запутался со всеми этими изменениями. Пожалуйста, послушайте меня как начинающего

в тебе метод onClick () -

if(v.getId()==R.id.fragment_button_1){
getActivity().getSupportFragmentManager().beginTransaction()
                            .add(R.id.fragment_frame, new Fragment1(), "createPost").addToBackStack(null).commit();
              }

где R.id.fragment_frame - rootContainer Id rootView в MainActivity.java

Вы должны использовать Framelayout для размещения фрагмента в деятельности.

как показано ниже - 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>

и ваша деятельность - 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();
        }
    }
}

Кстати, ваш фрагмент выглядит хорошо. надеюсь, это поможет вам.

 El.06 июн. 2016 г., 11:42
пожалуйста, добавьте ваш activity.xml. Вы добавляете фрагмент в свой корневой контейнер активности?
 bentech4u06 июн. 2016 г., 12:31
уже нравится только это, но не повезло MainActivity.java:paste.fedoraproject.org/375310/65208598 activity_main.xml:paste.fedoraproject.org/375312/14652086  Fragment1.java:paste.fedoraproject.org/375313/52086701 фрагмент_фрагмента1.xml:paste.fedoraproject.org/375315/65208704  фрагмент.xml:paste.fedoraproject.org/375316/14652087
 El.06 июн. 2016 г., 12:08
Я надеюсь, что вы написали, как - .add (R.id.mainlayout, новый Fragment1 ()). & установил фон - #ffffff или #FFF. тогда должно работать
 El.06 июн. 2016 г., 11:21
добавить фон в rootView фрагмента - <FrameLayout xmlns: android = "schemas.android.com/apk/res/android"xmlns: tools ="schemas.android.com/tools"android: layout_width =" match_parent "android: layout_height =" match_parent "android: background =" white_color "tools: context =" com.bentgeorge.fragment.Fragment1 ">
 bentech4u06 июн. 2016 г., 11:35
я дал #FFFFFF рекламный фон, единственное, что фрагмент показывает в белом поле, но кнопки все еще там
 bentech4u06 июн. 2016 г., 12:01
activity_main.xml:paste.fedoraproject.org/375304/20722814 , я пытался добавить фрагмент к деятельности. я не уверен в других взглядах, так как я очень новичок в этом.
 bentech4u06 июн. 2016 г., 11:20
Я пытался с "транзакции.replace (R.id.mainlayout, frag," Фрагмент теста ");" также. Тот же дисплей. я добавил цвет фона #fff для активности и никакой разницы, но одна область поля белого цвета появилась внутри моей основной деятельности
 bentech4u06 июн. 2016 г., 11:03
Привет спасибо за ваш ответ На самом деле я сделал некоторые изменения в событии клика, и фрагмент теперь отображается. но проблема в том, что кнопки все еще видны на моем главном экране. как скрыть кнопки при загрузке фрагмента
 El.08 июн. 2016 г., 12:15
пожалуйста, примите в качестве ответа, если это сработало.
 bentech4u06 июн. 2016 г., 11:15
при предоставлении вашего кода, я получаю не могу разрешить для "getActivity ()" и "addToBackStack"
 El.07 июн. 2016 г., 08:06
используйте FrameLayout в rootView активности.
 El.06 июн. 2016 г., 11:17
установите некоторый фон в rootView фрагмента, потому что, вероятно, вы добавляете фрагмент поверх активности. или вы также можете использовать - заменить. (R.id.fragment_frame, новый Fragment1 ()).
 FragmentTransaction fragmenttransaction = getSupportFragmentManager().beginTransaction();
   HomeFragment regcomplainfragment = new HomeFragment();
   fragmenttransaction.replace(R.id.content_frame, regcomplainfragment).addToBackStack("HomeFragment");
   fragmenttransaction.commit();

Ваш ответ на вопрос