【问题标题】:calling a method from a fragment inside a mainactivity从 mainactivity 中的片段调用方法
【发布时间】:2016-05-24 05:40:53
【问题描述】:

我已经尝试解决这个问题几天了,但仍然无法解决。我已经检查了许多关于此的类似主题,但没有得到我需要的东西。

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

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


}

这是我无法弄清楚的部分。我正在按标签搜索片段,它似乎不起作用,因为我总是得到空指针异常或类异常。 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>

主活动:

public class MainActivity extends AppCompatActivity implements Fragment_1.sendData {

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

片段 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"/>

【问题讨论】:

  • 请在您定义片段或其Framelayout 的位置显示您的布局XML - 我们需要确认您的框架布局的id 属性 - 这是您将与findFragmentById(id) 一起使用的id方法。
  • 我使用的是默认的(android.R.id.content)
  • 嗨,请通过包含布局 XML 文件更新您的问题,并向我们展示您的 ActivityonCreate 方法 - 我们需要检查这些并为您的问题提出解决方案。
  • 我更新了我的主题
  • @Nenco 尝试创建扩展Fragment 的活动,然后在FragmentManager manager = getSupportFragmentManager(); 之后调用FragmentTransaction

标签: android android-fragments


【解决方案1】:

问题似乎是您在 Activity 的 onCreate 中调用 displayFragment1();,但您希望找到您仅在 displayFragment2(); 中设置/初始化的 Fragment_2 - 您永远不会调用此方法。 所以,请将onCreate 方法中的代码更改为调用displayFragment2(),如下所示:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    displayFragment2();
}

更新: 请在提交语句之后添加调用getSupportFragmentManager().executePendingTransactions(),然后尝试通过标签查找Fragment,看看这是否至少返回一个Fragment 对象而不是null。您的代码现在看起来像:

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

我希望这会有所帮助。

【讨论】:

  • 那不是问题,我会用 fragment1 和 2 xmls sec 更新主题
  • 如您所见,我需要首先显示片段 1,因为我在那里进行了输入。当我单击发送时,它转到第二个片段,该输入显示在文本视图中。为此,我从 mainactivity 中的片段 2 调用 setChangeTo 方法。
  • 好的,注意到了。我已经更新了我的答案,请尝试一下,如果有帮助,请告诉我。
【解决方案2】:

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

【讨论】:

  • 如果我使用默认的或我创建的,效果相同。我用片段容器尝试了你的建议,但它仍然不起作用
【解决方案3】:

处理方法是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2019-01-05
    • 1970-01-01
    • 2019-05-22
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多