将数据从Activity传递到Fragment Class Cast Exception

时间:2016-05-06 11:54:04

标签: java android android-fragments

有很多方法,但我正在使用这个:

的活动:(Main2Activity)

public class Main2Activity extends AppCompatActivity{

private String myString = "hello";

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

public String getMyData() {
    return myString;
}
} 

片段:

public class MyFragment extends android.support.v4.app.Fragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    Main2Activity activity = (Main2Activity ) getActivity();
    String myDataFromActivity = activity.getMyData();
    return view;
}
}

主要活动:

    public class MainActivity extends AppCompatActivity {

   -------
    @Override
    protected void onCreate(Bundle savedInstanceState) {
     }
      ---
     private void setupViewPager(ViewPager viewPager) {

    Adapter adapter = new Adapter(getSupportFragmentManager());
    adapter.addFragment(new MyFragment(), "MyFragment");

    viewPager.setAdapter(adapter);
    }

但是它给了我阶级施放异常:

java.lang.ClassCastException: com.example.dev03.xyz.Activities.MainActivity cannot be cast to com.example.dev03.xyz.Fragments.MyActivity

java.lang.ClassCastException: com.example.dev03.xyz.Fragments.MainActivity cannot be cast to com.example.dev03.xyz.Fragments.Main2Activity

- 包装相同。

由于

7 个答案:

答案 0 :(得分:3)

您在MainActivity中创建了Fragment并且它属于它,因此当您使用getAcitvity()时,您将获得MainActivity而不是Main2Activity。

答案 1 :(得分:1)

尝试制作getMyData()静态

public static String getMyData() {
return myString;

}

然后以像

这样的片段访问它
Main2Activity.getMyData();

答案 2 :(得分:1)

在您的活动中,执行以下操作

MyFragment fragmentObj=new MyFragment();
Bundle args = new Bundle();
args.putString("Data_Key", string_value);
fragmentObj.setArguments(args);

现在使用FragmentTransaction将此片段添加到堆栈。

在此之后,在您的片段类onCreateView执行以下操作

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

View rootView = inflater.inflate(R.layout.fragment_xml_view, container, false);
  if (getArguments() != null) 
  {
      String valueReceived = getArguments().getString("Data_Key");
  }
 return rootView;
}

答案 3 :(得分:1)

创建MainActivity2的对象并访问以下方法:

MainActivity2 mn2=new ManiActivity2();
mn2.getMyData();

答案 4 :(得分:1)

如果您想完成这项工作,您必须将myFragment保持为Main2Activity而不是MainActivity。

答案 5 :(得分:1)

创建MainActivity2的对象,只需从Fragment Class

调用getMyData方法

答案 6 :(得分:1)

我搜索了一整天,最后我得到了完美的解决方案:如果有人遇到同样的问题,你可以按照这个答案。

无需在Main2Activity中创建任何方法并从MyFragment中调用它。 最佳实践是,使用startActivityForResult和onActivityResult。 这是代码:

片段:

    public class MyFragment extends android.support.v4.app.Fragment{

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

   Intent i = new Intent(getActivity(), Main2Activity.class);
            startActivityForResult(i, 1);
  }
  }  

Main2Activity:

  public class Main2Activity extends AppCompatActivity{

 private String myString = "hello";

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

    Intent returnIntent = new Intent();
            returnIntent.putExtra("result", selectedPath1);
            returnIntent.putExtra("result2", selectedPath2);
            setResult(Activity.RESULT_OK, returnIntent);
            finish();

}  
}

简单。