首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SugarORM in AndroidManifest

SugarORM in AndroidManifest
EN

Stack Overflow用户
提问于 2015-09-02 13:44:25
回答 1查看 475关注 0票数 0

我有一个问题:我使用SugarORM作为我的应用程序,在AndroidManifest中我需要设置如下:

代码语言:javascript
复制
<meta-data android:name="DATABASE" android:value="moneyManager.db" />
        <meta-data android:name="VERSION" android:value="1"/>
        <meta-data android:name="QUERY_LOG" android:value="true"/>
        <meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="ua.marinovskiy.moneymanager" />

这是:

代码语言:javascript
复制
android:name="com.orm.SugarApp"

现在,当我从适配器使用startActivityForResult时:

代码语言:javascript
复制
Intent intent = new Intent(context, NewOperation.class);
((Activity) context).startActivityForResult(intent, MainFragment.REQUEST_CODE);

我认为这个错误:

代码语言:javascript
复制
java.lang.ClassCastException: com.orm.SugarApp cannot be cast to android.app.Activity

我的问题是:如何将这个android:name="com.orm.SugarApp“从Manifest文件中删除,或者用其他方法来解决这个问题?

编辑:

代码语言:javascript
复制
public class MainFragment extends Fragment {

    public final static int REQUEST_CODE = 1;

    ViewPager viewPager;
    PagerAdapter viewPagerAdapter;

    List<List<CategoryParent>> list;
    List<Integer> balance_list = new ArrayList<>();
    List<String> periods_list = new ArrayList<>();

    SugarHelper sugarHelper;

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

        View view = inflater.inflate(R.layout.fragment_main,
                container, false);

        sugarHelper = new SugarHelper();

        list = sugarHelper.readAllOoerations(MainActivity.type_of_period, MainActivity.min_date, MainActivity.max_date, MainActivity.addedDate, balance_list);
        periods_list = sugarHelper.getPeriods();
        viewPager = (ViewPager) view.findViewById(R.id.pager);
        viewPagerAdapter = new ViewPagerAdapter(getActivity().getApplicationContext(), list, balance_list, periods_list);
        viewPager.setAdapter(viewPagerAdapter);
        viewPager.setCurrentItem(MainActivity.addedDate);

        return view;
    }


    @Override
    public void onResume() {
        super.onResume();
        list.clear();
        list.addAll(sugarHelper.readAllOoerations(MainActivity.type_of_period, MainActivity.min_date, MainActivity.max_date, MainActivity.addedDate, balance_list));
        if (!list.isEmpty()) {
            viewPagerAdapter.notifyDataSetChanged();
            viewPager.setAdapter(viewPagerAdapter);
            viewPager.setCurrentItem(MainActivity.addedDate);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == getActivity().RESULT_OK) {
            Toast.makeText(getActivity().getApplicationContext(), "done", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getActivity().getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
        }
    }

}

我的ViewPagerAdapter课程:

代码语言:javascript
复制
public class ViewPagerAdapter extends PagerAdapter {

    private OperationsAdapter operationsAdapter;
    private List<CategoryParent> categoryParentArrayList;
    private ExpandableListView expandableListView;

    TextView tv_balance, empty, current_period;

    Context context;
    List<List<CategoryParent>> list;
    List<Integer> balance_list;
    List<String> periods;

    LayoutInflater inflater;

    SugarHelper sugarHelper;

    public ViewPagerAdapter(Context context, List<List<CategoryParent>> list, List<Integer> balance_list, List<String> periods) {
        this.context = context;
        this.list = list;
        this.balance_list = balance_list;
        this.periods = periods;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((RelativeLayout) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.viewpager_item, container,
                false);

        sugarHelper = new SugarHelper();

        tv_balance = (TextView) view.findViewById(R.id.balance_operations);
        current_period = (TextView) view.findViewById(R.id.current_period);
        current_period.setText(periods.get(position));
        setBalance(balance_list, position);

        expandableListView = (ExpandableListView) view.findViewById(R.id.expListView);
        categoryParentArrayList = list.get(position);

        if (!categoryParentArrayList.isEmpty()) {

            empty = (TextView) view.findViewById(R.id.if_empty);
            empty.setVisibility(View.INVISIBLE);

            operationsAdapter = new OperationsAdapter(context, categoryParentArrayList);
            expandableListView.setAdapter(operationsAdapter);

            expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
                @Override
                public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {

                    v.setBackgroundColor(Color.parseColor("#B2EBF2"));

                    Intent intent = new Intent(context, NewOperation.class);
                    MainFragment mainFragment = new MainFragment();
                    mainFragment.startActivityForResult(intent, MainFragment.REQUEST_CODE);

                    return false;
                }
            });

            expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
                @Override
                public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {

                    Toast.makeText(context, "group", Toast.LENGTH_LONG).show();

                    return false;
                }
            });
        }

        ((ViewPager) container).addView(view);

        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // Remove viewpager_item.xml from ViewPager
        ((ViewPager) container).removeView((RelativeLayout) object);

    }

    public void setBalance(List<Integer> balance_list, int position) {
        tv_balance.setText("Balance: $" + balance_list.get(position));
        if (balance_list.get(position) < 0) {
            tv_balance.setBackgroundResource(R.drawable.balance_minus_style);
        } else {
            tv_balance.setBackgroundResource(R.drawable.balance_plus_style);
        }
    }

和例外情况:

代码语言:javascript
复制
09-03 14:40:03.915  13091-13091/ua.marinovskiy.moneymanager E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: Fragment MainFragment{426ee278} not attached to Activity
            at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:906)
            at ua.marinovskiy.moneymanager.adapter.ViewPagerAdapter$1.onChildClick(ViewPagerAdapter.java:95)
            at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:583)
            at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:522)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:2812)
            at android.widget.AbsListView$1.run(AbsListView.java:3571)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:153)
            at android.app.ActivityThread.main(ActivityThread.java:5297)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)

ua.marinovskiy.moneymanager.adapter.ViewPagerAdapter$1.onChildClick(ViewPagerAdapter.java:95)

在mainFragment.startActivityForResult(意图,MainFragment.REQUEST_CODE);

解决方案:

当我在((Activity) context).startActivityForResult(intent, MainFragment.REQUEST_CODE); ()上调用适配器getActivity().getApplicationContext()时,我离开了getActivity并修改了片段。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-02 14:07:11

您必须在清单中指定com.orm.SugarApp,这是不可避免的。

您正在尝试将context转换为该行中的一个活动:

代码语言:javascript
复制
((Activity) context).startActivityForResult(intent, MainFragment.REQUEST_CODE);

因此,context实际上是com.orm.SugarApp的一个实例,因此您将面临崩溃。

由于您是从片段中执行此操作的,所以请使用以下代码:

代码语言:javascript
复制
getActivity().startActivityForResult(intent, MainFragment.REQUEST_CODE);

更新:

不要将应用程序上下文传递给适配器,而是传递一个活动上下文:

这是错误的:

代码语言:javascript
复制
viewPagerAdapter = new ViewPagerAdapter(getActivity().getApplicationContext(), list, balance_list, periods_list);
    viewPager.setAdapter(viewPagerAdapter);

取而代之的是这样做:

代码语言:javascript
复制
viewPagerAdapter = new ViewPagerAdapter(getActivity(), list, balance_list, periods_list);
    viewPager.setAdapter(viewPagerAdapter);

更新:

您正在实例化一个片段,而不是将它附加到任何东西上,然后尝试使用它来触发startActivitiesForResult意图。这是错误的,请使用适配器中已有的上下文:

改变这一点:

代码语言:javascript
复制
MainFragment mainFragment = new MainFragment();
mainFragment.startActivityForResult(intent, MainFragment.REQUEST_CODE);

对此:

代码语言:javascript
复制
((Activity) context).startActivityForResult(intent, MainFragment.REQUEST_CODE);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32354916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档