2013-04-03 3 views
1

Итак, я экспериментирую с реализацией шаблона MVC в Android, где мои представления подклассы из RelativeLayout, LinearLayout, ScrollView и т. Д. Он работает, пока я не попытаюсь получить представление в моем представлении. Я получаю NPE. Я попытался получить доступ к представлению, чтобы установить onClickListener в конструкторе, а также в onAttachedToWindow(), но я получаю NPE в обоих местах.Как реализовать пользовательский вид как часть MVC?

Например, вот класс вид:

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); 
... 

ответ

0

Вы пытаетесь получить мнения ребенка во время конструктора представления. Поскольку они являются детскими взглядами, они еще не завышены. Можете ли вы переместить этот код из конструктора, возможно, в View.onAttachedToWindow()?

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

+0

Спасибо за ваше предложение. Я попытался поместить setOnClickListener() в onAttachedToWindow(), но я все еще получаю NPE. Любые другие предложения? Я добавил свой код активности выше. –

Смежные вопросы