【问题标题】:Passing data From Activity to Fragment using interface [closed]使用接口将数据从活动传递到片段[关闭]
【发布时间】:2016-09-04 09:39:32
【问题描述】:

我想使用接口将数据从活动传递到片段。 请看下面的代码sn-ps:

界面:

public interface FragmentCommunicator {

   public void passData(String name);
}

主活动:

public class MainActivity extends AppCompatActivity{

    FragmentCommunicator fragmentCommunicator;
    private Fragment fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b = (Button) findViewById(R.id.button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fragment= new Fragment();
                fragmentCommunicator = (FragmentCommunicator) getApplication();
                fragmentCommunicator.passData("hello");
                getSupportFragmentManager().beginTransaction().replace(R.id.container ,fragment).commit();

            }
        });

    }
}

片段:

public class Fragment extends android.support.v4.app.Fragment implements FragmentCommunicator {

    FragmentCommunicator communicator;
    Context c;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, null);

        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.c = context;

    }
    @Override
    public void passData(String name) {
        Toast.makeText(c, name, Toast.LENGTH_SHORT).show();
    }
}

我只想在单击按钮(或其他事件)时传递一些字符串来启动片段,并且当启动片段时,它应该显示包含该字符串的 toast...

请帮忙 任何帮助将不胜感激。

【问题讨论】:

标签: android android-fragments interface


【解决方案1】:

在onCreate方法之后写这行代码。

public void passVal(FragmentCommunicator fragmentCommunicator) {
    this.fragmentCommunicator = fragmentCommunicator;
}

类似的东西

public class MainActivity extends AppCompatActivity{

FragmentCommunicator fragmentCommunicator;
private Fragment fragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button b = (Button) findViewById(R.id.button);

    fragment= new Fragment();

    //App is crasing for this line. Working fine by removing it
    //fragmentCommunicator = (FragmentCommunicator) getApplication();

    //fragmentCommunicator.passData("hello");
    getSupportFragmentManager().beginTransaction().replace(R.id.container ,fragment).commit();

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            fragmentCommunicator.passData("Hello");

        }
    });

  }

   //Here is new method
   public void passVal(FragmentCommunicator fragmentCommunicator) {
       this.fragmentCommunicator = fragmentCommunicator;

   }
}

然后将这行代码写入片段的 onCreateView() 中。像这样的

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup  container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, null);

((MainActivity) getActivity()).passVal(new FragmentCommunicator() {
       @Override
       public void passData(String name) {
           Toast.makeText(c, name, Toast.LENGTH_SHORT).show();
       }
   });
  return view;
}

注意:无需在您的片段中实现 FragmentCommunicator 接口。希望它有效。这个对我有用。我已经测试过了

【讨论】:

  • 我应该从哪里开始我的片段?即开始交易?
  • 代码已更新再试一次。
  • java.lang.ClassCastException: android.app.Application 无法转换为 com.example.akshaysood.interfacecallback.FragmentCommunicator
  • 您想通过按任意按钮或片段初始时间来传递值吗?
  • 我想通过单击按钮传递值,同时应该启动片段
【解决方案2】:

在您的 Fragment 类中,有一个 TAG 字段。命名片段Fragment 可能会有点混乱,因为它与Android Fragment 同名,所以我将使用ExampleFragment

public class ExampleFragment extends android.support.v4.app.Fragment implements FragmentCommunicator {
    public static final String TAG = "ExampleFragment";

    // ...
}

现在,当您在活动中替换片段时,请确保传递TAG

getSupportFragmentManager().beginTransaction().replace(R.id.container ,fragment, ExampleFragment.TAG).commit();

请注意,在您的情况下应该是 Fragment.TAG,但我使用 ExampleFragment 来澄清 Fragment.TAG 不是 Android SDK 的一部分。

要在您的活动中获取片段的引用,请使用FragmentManager 查找您的片段:

Fragment myFragment = getSupportFragmentManager().findFragmentByTag(ExampleFragment.TAG);

然后您可以确保 myFragment 不是 null 并将其转换为 FragmentCommunicator

if (myFragment != null) {
    fragmentCommunicator = (FragmentCommunicator) myFragment;
}

请注意,在您的示例中,fragmentCommunicator = (FragmentCommunicator) getApplication(); 无效,因为实现接口的是您的片段,而不是您的应用程序。

【讨论】:

    【解决方案3】:

    活动包含片段,您不需要传递任何内容。一种技术是将您的数据存储在活动范围内,并使用 getActivity() 获取对它的引用。

    Best practice to reference the parent activity of a fragment?

    就您发布的代码而言,我看不到您在片段中调用传递数据方法的位置。我建议在 onviewcreated() 中调用它。

    我稍后会尝试提供一些示例代码,因为事实证明在我的移动设备上这样做很困难。

    试试passdata(getActivity().someStringVariable);

    【讨论】:

    • 我将如何传递数据和访问数据你能写一个简单的例子吗?
    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    相关资源
    最近更新 更多