Как реализовать Custom View как часть MVC?

Поэтому я экспериментирую с реализацией шаблона MVC в Android, где мои представления разделены на подклассы из RelativeLayout, LinearLayout, ScrollView и т. Д. Это работает до тех пор, пока я не попытаюсь удержать представление в своем представлении. Я получаю NPE. Я попытался получить доступ к представлению, чтобы установить onClickListener в конструкторе, а также в onAttachedToWindow(), но я получаю 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:

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

    <!-- kv Row 1 -->

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:orientation="horizontal" 
        android:layout_weight="1"
        android:baselineAligned="false">

        <RelativeLayout
            android:id="@+id/relativeLayout_achievement1"
            style="@style/linearLayout_achievement"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_margin="@dimen/margin_sm"
            android:layout_weight="1" >

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

И вот как я создаю представление из моей Деятельности:

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

Другие вопросы по тегам