【问题标题】:calling a method in an android fragment from the mainActivity从 mainActivity 调用 android 片段中的方法
【发布时间】:2016-11-27 16:46:47
【问题描述】:

今天我尝试构建自己的第一个 Android 应用。

我想获得一个显示片段的主要活动(在我的例子中,它被称为“eingabeFragment”)。该片段包含一个editText 和一个按钮。按下按钮后,我希望“eingabeFragment”消失并显示一个新的“anzeigeFragment”。

到目前为止一切正常。现在我希望在“eingabeFragment”中输入的文本显示在我的“anzeigefragment”中。

我尝试使用活动实现的“eingabefragment”中的接口来管理它。

按下按钮后,mainactivity 通过调用我的 getText 方法从“eingabeFragment”中获取文本。

出于调试目的,我添加了一个 System.out.println 来测试我的程序。 所以我知道,这部分工作正常。

现在我想我只需要将这个字符串添加到我的“anzeigeFragment”中的文本视图中。不幸的是,输出是“Fragment not found”,这意味着当我在“anzeigenFragment”中调用“setInfo”方法时得到一个 Nullpointer。

我的问题是如何在该片段替换旧片段后从活动中访问片段中的公共方法。

AnzeigeFragment

package local.mydomain.versuch;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


public class AnzeigeFragment extends Fragment {


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_anzeige, container, false);


}

public void setInfo(String text)
{
    TextView az = (TextView) getView().findViewById(R.id.output);
    az.setText(text);
}



}

EingabeFragment

package local.mydomain.versuch;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;


public class EingabeFragment extends Fragment {
public static String MESSAGE = "local.mydomain.versuch.MESSAGE";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_eingabe, container, false);


}

public interface Clicked{
    public void pressed(View view);
}

public String getInfo()
{
    EditText et = (EditText) getView().findViewById(R.id.eingabe);
    String result = et.getText().toString();
    return result;
}

}

最后是 MainActivity

package local.mydomain.versuch;

import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends FragmentActivity implements   EingabeFragment.Clicked{

public static String MESSAGE = "local.mydomain.versuch.MESSAGE";
private EingabeFragment eingabeFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(findViewById(R.id.fragment_container)!=null)
    {
        if (savedInstanceState != null)
        {
            return;
        }
    }
    eingabeFragment = new EingabeFragment();
    getSupportFragmentManager().beginTransaction().
            add(R.id.fragment_container,eingabeFragment, "Eingabe").commit();

}

@Override
public void pressed(View view) {

    EingabeFragment ef = (EingabeFragment)   getSupportFragmentManager().findFragmentByTag("Eingabe");
    String info = ef.getInfo();

    System.out.println(info);

    AnzeigeFragment anzeigeFragment = new AnzeigeFragment();
    FragmentTransaction transaction=   getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, anzeigeFragment, "AnzeigeFrag");
    transaction.addToBackStack(null);

    transaction.commit();

    AnzeigeFragment az = (AnzeigeFragment) getSupportFragmentManager().findFragmentByTag("AnzeigeFrag");

    if (az==null)
    {
        System.out.println("Fragment not found");
    }
    else
    {
        System.out.println("Everything ok");
        az.setInfo(info);
    }

    System.out.println(info);
}
}

任何解释将不胜感激

【问题讨论】:

    标签: java android android-studio fragment


    【解决方案1】:

    你可以通过 bundle 在你的两个片段之间传递消息

    像这样更新你的代码

    AnzeigeFragment anzeigeFragment = new AnzeigeFragment();
    
    Bundle data=new Bundle()
    Data.putStringExtra("messagekey","message value");
    
    anzeigeFragment.setArguments(data);
    > FragmentTransaction transaction=
    > getSupportFragmentManager().beginTransaction();
    > transaction.replace(R.id.fragment_container, anzeigeFragment,
    > "AnzeigeFrag"); transaction.addToBackStack(null);
    

    在您的第二个片段中您可以通过调用片段的 getArgument() 方法来检索此数据。

    然后是getStringExtra("messagekey")方法。

    【讨论】:

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