如何从视图中获取活动?

时间:2018-01-17 14:29:36

标签: android android-activity classcastexception

我有一个扩展课程。我需要活动。

public class RequestRecord extends RelativeLayout
{
    public RequestRecord(Context context)
    {
        super(context);
        ContextWrapper ctx = ((ContextWrapper) getContext());
        ScrollView sv = (ScrollView) ((Activity) 
                                   ctx).findViewById(R.id.myReqList_scroll);
   }
}

异常:java.lang.ClassCastException:android.app.ContextImpl无法强制转换为android.content.ContextWrapper

帮帮我?

4 个答案:

答案 0 :(得分:1)

当我从通货膨胀中获取视图而不是通过一些棘手的手动实例化时(例如,如果视图是使用应用程序上下文创建的,它将不起作用),这对我来说总是有效:

@NonNull
public static <T extends Activity> T findActivity(@NonNull Context context) {
    if(context == null) {
        throw new IllegalArgumentException("Context cannot be null!");
    }
    if(context instanceof Activity) {
        // noinspection unchecked
        return (T) context;
    } else {
        ContextWrapper contextWrapper = (ContextWrapper) context;
        Context baseContext = contextWrapper.getBaseContext();
        if(baseContext == null) {
            throw new IllegalStateException("Activity was not found as base context of view!");
        }
        return findActivity(baseContext);
    }
}

答案 1 :(得分:1)

getContext()返回的任何上下文对象都不会扩展ContextWrapper。此外,View可以不应该访问其父Activity,也不应该知道Activity。为什么视图需要以这种方式了解另一个视图。正确的方法是,如果你想访问兄弟视图,那就是获取你的父ViewGroup并迭代它的子节点。请注意,在您进入构造函数期间,您还没有父View,因此调用getParent()将返回null。您需要在任何on *方法中执行该操作,例如:onMeasure,onLayout,onSizeChanged和onSizeChanged。

答案 2 :(得分:0)

如果ScrollView myReqList_scroll 位于 RequestRecord 中,您可以这样调用

public class RequestRecord extends RelativeLayout
{
    public RequestRecord(Context context)
    {
        super(context);
        ScrollView sv = (ScrollView) findViewById(R.id.myReqList_scroll);
    }
}

答案 3 :(得分:0)

public static <T extends Activity> T findActivity(@NonNull Context context) {
    T activity = null;

    if (context == null) {
        return null;
    }

    if (context instanceof Activity) {
        activity = (T) context;
    } else if (context instanceof ContextWrapper) {
        ContextWrapper contextWrapper = (ContextWrapper) context;

        Context baseContext = contextWrapper.getBaseContext();

        activity = findActivity(baseContext);
    } else if (context.getClass().getName().endsWith("ContextImpl")) {
        try {
            Context baseContext = getOuterContext(context);
            activity = findActivity(baseContext);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } else {
        activity = null;
    }

    return activity;
}