Android 从mainactivity内的片段调用方法

Android 从mainactivity内的片段调用方法,android,android-fragments,Android,Android Fragments,我已经试着解决这个问题好几天了,但还是想不出来。我已经检查了很多类似的话题,但没有得到我需要的 如您所见,我正在动态添加片段: public void displayFragment1() { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_container,

我已经试着解决这个问题好几天了,但还是想不出来。我已经检查了很多类似的话题,但没有得到我需要的

如您所见,我正在动态添加片段:

  public void displayFragment1() {

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, new Fragment_1(), "frag1");
    fragmentTransaction.commit();


}

public void displayFragment2() {

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, new Fragment_2(), "frag2");
    fragmentTransaction.commit();


}
这是我搞不懂的部分。我正在按标记搜索片段,但它似乎不起作用,因为我总是得到nullpointer异常或classexception。Toast只显示我输入的文本的值,因此它将数据从片段发送到活动。所以那部分很好。有什么想法吗,伙计们

 @Override
public void inputValue(String text) {

    if (text != null) {

        Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();

        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, new Fragment_2(), "frag2");
        fragmentTransaction.commit();

        FragmentManager fm = getSupportFragmentManager();
        Fragment_2 fragment = (Fragment_2) fm.findFragmentByTag("frag2");
        fragment.setChangeTo(text);


    } else {

        Toast.makeText(MainActivity.this, "didnt recieve the value", Toast.LENGTH_SHORT).show();

    }


}
活动主xml

<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"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.neven.question_for_stackoverflow.MainActivity"
    android:background="@drawable/my_background">

<FrameLayout android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:id="@+id/fragment_container">

</FrameLayout>
片段1 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.example.neven.question_for_stackoverflow.Fragment_1"
         android:background="@drawable/my_background">

<!-- TODO: Update blank fragment layout -->
<TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment"/>
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="fragment 1"
        android:id="@+id/textView" android:layout_gravity="center"/>
<EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/etInputID" android:layout_gravity="center" android:layout_marginTop="50dp"
        android:hint="enter text here" android:textColorHint="#e3ca0a"/>
<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send"
        android:id="@+id/bSendID" android:layout_gravity="center_horizontal|bottom"
        android:layout_marginBottom="130dp"/>

片段2 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.example.neven.question_for_stackoverflow.Fragment_2"
         android:background="@drawable/my_background">

<!-- TODO: Update blank fragment layout -->
<TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment"/>
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="fragment 2 - change me"
        android:id="@+id/tvChangeMeID" android:layout_gravity="center"/>


您应该在活动的布局xml中声明一个FrameLayout,您想要的片段将在其中膨胀。然后在进行事务时使用该FrameLayout的id,而不是android.R.id.content。

您应该在活动的布局xml中声明一个FrameLayout,您想要的片段将在其中膨胀。然后在进行事务时使用该FrameLayout的id,而不是android.R.id.content。

处理此问题的方法是:

Fragment fragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container); 
if (fragment instanceof    YourFragmentClass) {
fragment.setChangeTo(value);
}

处理这个问题的方法是:

Fragment fragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container); 
if (fragment instanceof    YourFragmentClass) {
fragment.setChangeTo(value);
}

问题似乎是您正在调用
displayFragment1()在活动的
onCreate
中,但您希望找到的
片段_2
仅在
displayFragment2()中设置/初始化-您从未调用此方法。
因此,请将
onCreate
方法中的代码更改为调用
displayFragment2()
,如下所示:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    displayFragment2();
}
更新: 请在commit语句之后添加调用
getSupportFragmentManager().executePendingTransactions()
,然后尝试按标记查找
片段,查看这是否至少返回
片段
对象且不为空。您的代码现在看起来像:

...
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, new Fragment_2(), "frag2");
        fragmentTransaction.commit();
        getSupportFragmentManager().executePendingTransactions()

    Fragment_2 fragment = (Fragment_2) getSupportFragmentManager().findFragmentByTag("frag2");
    fragment.setChangeTo(text);

我希望这会有所帮助。

问题似乎是您正在调用
displayFragment1()在活动的
onCreate
中,但您希望找到的
片段_2
仅在
displayFragment2()中设置/初始化-您从未调用此方法。
因此,请将
onCreate
方法中的代码更改为调用
displayFragment2()
,如下所示:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    displayFragment2();
}
更新: 请在commit语句之后添加调用
getSupportFragmentManager().executePendingTransactions()
,然后尝试按标记查找
片段,查看这是否至少返回
片段
对象且不为空。您的代码现在看起来像:

...
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, new Fragment_2(), "frag2");
        fragmentTransaction.commit();
        getSupportFragmentManager().executePendingTransactions()

    Fragment_2 fragment = (Fragment_2) getSupportFragmentManager().findFragmentByTag("frag2");
    fragment.setChangeTo(text);

我希望这能有所帮助。

请在定义片段或其
Framelayout
的位置显示布局XML-我们需要确认Framelayout的
id
属性-这是
id
您将与
findfracentbyid(id)
方法一起使用的
id。我正在使用默认的(android.R.id.content)Hi,请通过包含布局XML文件更新您的问题,并向我们展示您的
活动的
onCreate
方法
-我们需要检查这些方法并为您的问题提出解决方案。我更新了我的topic@Nenco尝试创建扩展
Fragment
的活动,然后在之后调用
FragmentTransaction
FragmentManager=getSupportFragmentManager()
。请在定义片段或其
Framelayout
的位置显示布局XML-我们需要确认Framelayout的
id
属性-这是
id
您将与
findfracentbyid(id)
方法一起使用的
id。我正在使用默认的(android.R.id.content)Hi,请通过包含布局XML文件更新您的问题,并向我们展示您的
活动的
onCreate
方法
-我们需要检查这些方法并为您的问题提出解决方案。我更新了我的topic@Nenco尝试创建扩展
Fragment
的活动,然后在之后调用
FragmentTransaction
FragmentManager=getSupportFragmentManager()。如果使用默认值或创建的值,效果相同。我尝试了你对fragment容器的建议,但如果我使用默认容器或我创建的容器,效果仍然不一样。我用FragmentContainer尝试了你的建议,但仍然不起作用这不是问题所在,我将用fragment1和2 xmls secs更新主题,因此你会看到我需要首先显示fragment1,因为我在那里输入了一个信息。当我点击send时,它进入到第二个片段,在那里输入显示在文本视图中。为此,我从mainactivity.OK中的片段2调用setChangeTo方法。我已经更新了我的答案,请尝试一下,并让我知道这是否有帮助。这不是问题所在,我将使用fragment1和2 xmls secs更新主题,因此您会看到我需要首先显示fragment1,因为我在那里输入了内容。当我点击send时,它进入到第二个片段,在那里输入显示在文本视图中。为此,我从mainactivity.OK中的片段2调用setChangeTo方法。我已经更新了我的答案,请尝试一下,让我知道这是否有帮助。