有没有办法从不扩展Activity类的类调用`overridePendingTransition`?

时间:2014-03-12 14:07:12

标签: android android-intent android-activity transition android-context

我正在使用另一个类在显示主要活动时在后台运行一些东西,并将该活动的上下文传递给此背景类。我正在从这个后台类开始另一个活动,但是我无法在这里调用overridePendingTransition,因为对于BackgroundClass类型,“方法overridePendingTransition(int,int)是未定义的。”

public class GetUPC extends AsyncTask<Void, Void, Void> 
{       
    @Override
    protected void onPreExecute() 
    {
        ...
    }
    @Override
    protected Void doInBackground(Void... arg0) 
    {
        ...


                    boolean dairy;
                    if(theDairy.equals("N"))
                    {
                        //milk test
                        dairy=true;
                    }
                    else
                    {
                        dairy=false;
                    }



                    //depending on if there is a warning it will either display the warning screen or skip it
                    if(dairy)
                    {
                        Intent intent_warn = new Intent(context, WarningScreen.class);

                        intent_warn.putExtra("Name", str_name);
                        intent_warn.putExtra("Size", str_size);
                        intent_warn.putExtra("Price", str_price);
                        intent_warn.putExtra("Carbs", str_carbs);
                        intent_warn.putExtra("Protein", str_protein);
                        intent_warn.putExtra("Fiber", str_fiber);
                        intent_warn.putExtra("Sugar", str_sugar);
                        intent_warn.putExtra("SatFat", str_satFat);
                        intent_warn.putExtra("TotFat", str_totFat);
                        intent_warn.putExtra("Cholesterol", str_cholesterol);
                        intent_warn.putExtra("Sodium", str_sodium);
                        intent_warn.putExtra("Potassium", str_potassium);
                        intent_warn.putExtra("Calories", str_calories);
                        intent_warn.putExtra("Warning", "Contains Dairy");
                        intent_warn.putExtra("WarningRed", true);
                        Log.e("Warning",intent_warn.getExtras().getString("Warning"));

                        context.startActivity(intent_warn);
                        overridePendingTransition(R.layout.fade_in, R.layout.fade_out);  //THIS PART ISN'T WORKING//
                    }
                    else
                    {
                        Intent intent_menu = new Intent(context, DisplayScreen.class);
                        intent_menu.putExtra("Name", str_name);
                        intent_menu.putExtra("Size", str_size);
                        intent_menu.putExtra("Price", str_price);
                        intent_menu.putExtra("Carbs", str_carbs);
                        intent_menu.putExtra("Protein", str_protein);
                        intent_menu.putExtra("Fiber", str_fiber);
                        intent_menu.putExtra("Sugar", str_sugar);
                        intent_menu.putExtra("SatFat", str_satFat);
                        intent_menu.putExtra("TotFat", str_totFat);
                        intent_menu.putExtra("Cholesterol", str_cholesterol);
                        intent_menu.putExtra("Sodium", str_sodium);
                        intent_menu.putExtra("Potassium", str_potassium);
                        intent_menu.putExtra("Calories", str_calories);
                        intent_menu.putExtra("Warning",  "Contains no allergens");
                        intent_menu.putExtra("WarningRed", false);
                        Log.e("Warning",intent_menu.getExtras().getString("Warning"));

                        context.startActivity(intent_menu);
                    }


                    Log.e("KYLE_DATA_UPCH",str_name+" "+str_price+""+str_size);
                } 
            }
                catch (JSONException e) 
                {
                    e.printStackTrace();
                }

            } 
            else 
            {
                Log.e("ServiceHandler", "Couldn't get any data from the url");
                _errorCode=3;
            }

            return null;
        }
    @Override
    protected void onPostExecute(Void result) 
    {
        ...
    }



}

5 个答案:

答案 0 :(得分:21)

所以我实际上能够通过在上下文中调用overridePendingTransition来解决问题,并将其转换为一个Activity。

((Activity) context).overridePendingTransition(R.layout.fade_in, R.layout.fade_out);

我意识到这不是最好的做法,可能会因为更复杂的应用程序而变得混乱,但就我们的目的而言,我认为这是可以的。我想最终调查@bariscan Kayaoglu的解决方案,因为它似乎更强大。

答案 1 :(得分:5)

只是为Tims回答添加一些安全性,在投射之前检查上下文是否是Activity的一个实例:

if (context instanceof Activity) {
  ((Activity) context).overridePendingTransition(R.layout.fade_in, R.layout.fade_out);
}

这只是确保你调用一个真正存在的方法。你也可以使用try / catch,但我认为这就足够了

答案 2 :(得分:2)

最好创建一个接口并回调它的方法。

myInterface mInterface;
public interface myInterface {
    public abstract void myTask();
}

public GetUPC(myInterface mInterface) {
    this.mInterface = mInterface;
}

在你的doInBackground方法中,完成后,调用

mInterface.myTask();

在创建异步任务时,不要忘记实现您的活动界面并将其发送给构造函数。

myAsyncTask = new GetUPC(this);

您的开发平台将通知您实现myTask()等未实现的方法。您可以在访问活动时随意使用该方法。

答案 3 :(得分:0)

我认为这不是一个好主意。由于您的类是异步任务,因此您选择的活动可能不是活动活动,因为您的异步任务将在后台运行。但是如果你考虑内存泄漏和空指针,你可以将你的活动发送给你的构造函数。

答案 4 :(得分:0)

您无法从后台线程执行任何UI更新部分,但是如果想要执行相同的操作,则覆盖AsyncTask类的onProgressUpdate并通过您的活动启动代码。调用此方法调用publishProgress。在开始活动之前,您必须取消AsyncTask,否则您的应用程序将会发送。