【问题标题】:Pass data from Activity to Fragment Class Cast Exception将数据从 Activity 传递到 Fragment 类强制转换异常
【发布时间】:2016-05-06 11:54:03
【问题描述】:

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

活动:(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

-- 包装相同。

谢谢

【问题讨论】:

标签: java android android-fragments


【解决方案1】:

您在 MainActivity 中创建您的 Fragment,它属于它,因此当您使用 getAcitvity() 时,您会得到 MainActivity 而不是 Main2Activity。

【讨论】:

  • 是啊!!! ,这似乎很有意义。(+1)..我应该在这里用什么代替getActivity。
【解决方案2】:

尝试将您的 getMyData() 设为静态

public static String getMyData() {
return myString;

}

然后像片段一样访问它

Main2Activity.getMyData();

【讨论】:

    【解决方案3】:

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

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

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

    之后,在 Fragment 类的 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;
    }
    

    【讨论】:

    • 这是 gud .. 但我遵循不同的方式,不使用事务或捆绑。我很感激。谢谢朋友
    • @Minkoo 这是标准方式。不建议使用 getter setter。
    • 谢谢哥们,你是对的,今天我读到了,即使在你的文章中,它也有松散耦合。谢谢我以后一定会用这个方法。
    【解决方案4】:

    创建MainActivity2的对象,访问方法如下:

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

    【讨论】:

    • 你不能创建Activity的对象。
    • 是的!这是一个愚蠢的错误,但你得到了那个愚蠢的错误。谢谢好友...
    • @Minkoo 可能正在工作。但是创建activity对象对程序员来说是个坏习惯!
    • 是的!我同意..即使我应该使用 Bundle 或 Transaction 来发送数据...我的方法具有紧密耦合...但是您也是对的。谢谢好友
    【解决方案5】:

    如果你想完成这项工作,你必须将你的 myFragment 保存到 Main2Activity 而不是 MainActivity。

    【讨论】:

    • 我很感激,但这是一个愚蠢的错误......我应该使用类似 MainActivity2 mn2=new ManiActivity2(); mn2.getMyData();
    【解决方案6】:

    创建一个 MainActivity2 对象并简单地从 Fragment 类调用您的 getMyData 方法

    【讨论】:

      【解决方案7】:

      我找了一整天,终于找到了完美的解决方案:如果有人有同样的问题,你可以按照这个答案。

      无需在 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();
      
      }  
      }
      

      简单。

      【讨论】:

        猜你喜欢
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        • 2021-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多