android 如何从视图中获取Activity?

muk1a3rh  于 2023-01-28  发布在  Android
关注(0)|答案(4)|浏览(200)

我有一节延伸课,我需要活动.

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.无法将android. app. ContextImpl强制转换为android. content.上下文 Package
帮帮我?

eoigrqb6

eoigrqb61#

当我从膨胀而不是通过一些复杂的手动示例化获得视图时,这对我来说总是有效的(例如,如果视图是用应用程序上下文创建的,它就不起作用):

@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);
    }
}
z3yyvxxp

z3yyvxxp2#

getContext()返回的任何上下文对象都不会扩展ContextWrapper。此外,视图不应该访问其父视图Activity,它们甚至不应该知道Activity。为什么一个视图需要以这种方式知道另一个视图。如果你想访问兄弟视图,正确的方法是,就是得到你的父ViewGroup,然后迭代它的子。注意,在构造函数中,你还没有一个父View,所以调用getParent()会返回null。你需要在任何on* 方法中做这个工作,比如:一米八氮一x、一米九氮一x、一米十氮一x和一米十一氮一x。

mzmfm0qo

mzmfm0qo3#

如果ScrollViewmyReqList_scroll位于您的RequestRecord内,则可以如下调用

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

a0zr77ik4#

fun getActivity(context: Context?): Activity? {
    return if (context is Activity) context
    else if (context is ContextThemeWrapper) getActivity(context.getBaseContext())
    else if (context?.javaClass?.simpleName?.contentEquals("ContextImpl") ?: false)
        getActivity(getOuterContext(context))
    else {
        while (context is ContextWrapper) {
            if (context is Activity)
                context
            else
                getActivity(context.getBaseContext())
        }
        null
    }
}

fun getOuterContext(context: Context?): Context? {
    try {
        val f: Field? = context?.javaClass?.getDeclaredField("mOuterContext")
        f?.setAccessible(true)
        return if (f == null) null else (f.get(context) as Context?)
    } catch (e: java.lang.Exception) {
        e.printStackTrace()
        return null
    }
}

相关问题