【问题标题】:How to send cursor from android activity to fragment如何将光标从android活动发送到片段
【发布时间】:2022-01-28 07:22:17
【问题描述】:

实际上我知道如何将额外的值从活动发送到片段,但我需要将联系人光标发送到片段,然后我将该光标传递给光标适配器并在列表视图中显示数据。

【问题讨论】:

    标签: android fragment android-cursor


    【解决方案1】:

    有多种方法可以完成您正在尝试做的事情。只有其中一些要求您在创建片段之前拥有光标。


    你可以创建一个方法来创建你的片段,然后传入光标:

    public class YourFragment extends Fragment {
    
        private Cursor mCursor;
    
        public static YourFragment createYourFragmentWithCursor( Cursor cursor ) {
            YourFragment fragment = new YourFragment();
            fragment.setCursor( cursor );
            return fragment;
        }
    
        @Override
        public void onViewCreated (View view, Bundle savedInstanceState) {
            ListView listView = (ListView) findViewById( R.id.yourListView );
            listView.setAdapter( new CursorAdapter( getActivity(), getCursor() );
        }
    
        protected Cursor getCursor() {
            return mCursor;
        }
    
        private Cursor setCursor( Cursor cursor ) {
            mCursor = cursor;
        }
    }
    

    您可以将游标从活动传递到它控制的片段,让活动实现一个包含返回游标的方法的接口。然后,在您的片段中,您可以获得对该接口的引用。

    例如:

    public interface CursorProvidingInterface {
        Cursor getCursor();
    }
    
    
    public class YourActivity extends Activity implements CursorProvidingInterface {
        ...
        @Override
        public Cursor getCursor() {
            Cursor cursor = whateverYouDoToAcquireYourCursor();
            return cursor;
        }
        ...
    }
    
    
    
    public class YourFragment extends Fragment {
    
        private CursorProvidingInterface cursorProvidingInterface;
    
        @Override
        public void onAttach( Activity activity ) {
            try {
                cursorProvidingInterface = (CursorProvidingInterface) activity;
            }
            catch (ClassCastException e) {
                throw new RuntimeException( activity.getClass().getName() + " must implement " + CursorProvidingInterface.class.getName() );
            }
        }
    
        @Override
        public void onViewCreated (View view, Bundle savedInstanceState) {
            ListView listView = (ListView) findViewById( R.id.yourListView );
            listView.setAdapter( new CursorAdapter( getActivity(), cursorProvidingInterface.getCursor() );
        }
    }
    

    根据您的情况,上述策略可能不是最佳选择。

    假设您的游标来自数据库,我建议您在创建片段时简单地从数据库中获取游标。如有必要,您可以将可能需要的任何查询参数作为参数传递给片段。

    在这种情况下,我更喜欢使用某种形式的依赖注入,例如 RoboGuice,并创建一个 @Singleton 类来处理您的数据库事务,然后您可以 @Inject 并在需要时调用它。


    您可以考虑实现ContentProvider 并使用它来获取您需要的光标。如果您从光标显示的数据可能经常更改,这可能会特别有用。


    最后两种情况是在游标中传递数据的更可靠的方法,我建议您熟悉它们。搜索有关这些方法的教程将产生比我在此处提供的更好的示例。

    【讨论】:

      【解决方案2】:

      使用构造函数将值传递给片段。然后将构造函数中的值分配给实例变量。然后你可以在 onCreateView() 方法中使用 cursor 来初始化它与片段开始。

      更新: 创建setter方法来设置Fragment中的Cursor,所以添加以下方法

         public static setMyCursor(Cursor pCursor){
            this.cursor=pCursor;
         }
      

      使用构造函数作为公共

         public MyFragment(){
      
         }
      

      使用 setMyCursor() 方法设置光标

      【讨论】:

      • 不工作它显示错误:避免片段中的非默认构造函数:使用默认构造函数加 Fragment#setArguments(Bundle) 代替
      • @suresh 不要重载构造函数,而是添加一个名为 newInstance 的公共方法,该方法接受参数,然后在其中调用 setArguments 来存储您要保存的内容。这是一篇详细描述如何进行的帖子:stackoverflow.com/questions/9245408/…
      猜你喜欢
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      相关资源
      最近更新 更多