如何实现自定义视图作为 MVC 的一部分?

Posted

技术标签:

【中文标题】如何实现自定义视图作为 MVC 的一部分?【英文标题】:How to implement Custom View as part of MVC? 【发布时间】:2013-04-03 00:29:31 【问题描述】:

所以我正在尝试在 android 中实现 MVC 模式,其中我的视图是从 RelativeLayout、LinearLayout、ScrollView 等子类化的......它一直在工作,直到我尝试在我的视图中获取一个视图。我得到一个NPE。我尝试访问视图以便在构造函数和 onAttachedToWindow() 中设置 onClickListener,但我在这两个地方都得到了 NPE。

例如,这是一个视图类:

public class ViewAchievements extends LinearLayout

    private RelativeLayout mRelativeLayoutAchievement1;

    public ViewAchievements(Context context, AttributeSet attrs)
    
        super(context, attrs);

        mRelativeLayoutAchievement1 = (RelativeLayout) findViewById(R.id.relativeLayout_achievement1);
        mRelativeLayoutAchievement1.setOnClickListener((OnClickListener) context); //NPE on this line
    

    @Override
    protected void onAttachedToWindow()
    
        super.onAttachedToWindow();

        mRelativeLayoutAchievement1.setOnClickListener(mOnClickListener); //Also get NPE on this line
    

谁能告诉我获取子视图的正确方法,在本例中为 mRelativeLayoutAchievement1?

这是一个 XML sn-p:

<com.beachbody.p90x.achievements.ViewAchievements xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="@color/gray_very_dark"
    android:orientation="vertical" >

    <!-- kv Row 1 -->

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal" 
        android:layout_weight="1"
        android:baselineAligned="false">

        <RelativeLayout
            android:id="@+id/relativeLayout_achievement1"
            style="@style/linearLayout_achievement"
            android:layout_
            android:layout_
            android:layout_margin="@dimen/margin_sm"
            android:layout_weight="1" >

            <TextView
                android:id="@+id/textView_achievement1"
                style="@style/text_small_bold_gray"
                android:layout_ 
                android:layout_
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true"
                android:layout_marginBottom="@dimen/margin_large"
                android:text="1/20" />
        </RelativeLayout>
...

下面是我从我的 Activity 创建视图的方式:

public class ActivityAchievements extends ActivitySlidingMenu

    private ViewAchievements mViewAchievements;

    @Override
    public void onCreate(Bundle savedInstanceState)
    
        mViewAchievements = (ViewAchievements) View.inflate(this, R.layout.view_achievements, null);
        setContentView(mViewAchievements);
...

【问题讨论】:

【参考方案1】:

您试图在视图的构造函数中获取子视图。由于它们是子视图,因此它们还没有被夸大。你能把这段代码移出构造函数,可能移到 View.onAttachedToWindow() 中吗?

http://developer.android.com/reference/android/view/View.html#onAttachedToWindow()

【讨论】:

感谢您的建议。我尝试将 setOnClickListener() 放在 onAttachedToWindow() 中,但我仍然得到 NPE。还有其他建议吗?我在上面添加了我的活动代码。

以上是关于如何实现自定义视图作为 MVC 的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

当我从 UITableViewController 打开自定义 UIView 时,如何关闭自定义视图并返回表格视图?

实现自定义 MVC 基本视图页面

在 mvc 视图的 web.config 自定义部分中获取参数的值

如何使用自定义 UICollectionReusableView 作为集合视图的部分标题?

MVC:我应该在 View Controller 或 UIView 的自定义子类中添加和实现触摸手势吗

如何在 ASP.Net MVC 5 视图中获取 ApplicationUser 的自定义属性值?