findViewById возвращает ноль для пользовательского ImageView, используя класс обработчика - PullRequest
2 голосов
/ 19 марта 2012

Я прочитал множество потоков в findViewById, возвращающих ноль для пользовательского класса, и я не смог точно определить свою ошибку.У меня есть основная деятельность, которая раздувает фрагмент (LinearLayout).Я хочу заполнить этот LinearLayout несколькими из моих пользовательских ImageViews, используя обработчик.Обработчик в основном создает каждый из пользовательских ImageView и помещает их в ArrayList, который можно прочитать в основном упражнении.

В моем пользовательском ImageView у меня есть следующие конструкторы:

public CustomView(Context context) {
    super(context);
}
public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
}
public CustomView(Context context, int ID, String c, String s, int relID, int relAngle,
        Float absX, Float absY, int [] inNumbers ) {
    super(context);

    this.setId(ID);
    color = c;
    size = s;
    x_pos = absX;
    y_pos = absY;
    dependence = inNumbers;
    rel_id = relID;
    rel_angle = relAngle;
}

Тогдав своем классе обработчика я делаю следующее:

customViews = new ArrayList<CustomView>();

for ( int k = 0; k < numberOfCustomViews; k++ ){

          CustomView w = new CustomView(ctx,
                  scanner.nextInt(),                    //ID
                  scanner.next(),                       //Color
                  scanner.next(),                       //Size
                  scanner.nextInt(),                    //Relative ID
                  scanner.nextInt(),                    //Relative angle
                  scanner.nextFloat(),                  //Absolute x (percent)
                  scanner.nextFloat(),                  //Absolute y (percent)
                  new int[] {scanner.nextInt(),         //Dependence numbers
                    scanner.nextInt()});

            customViews.add(w);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                    w.getSizeAsResource(), w.getSizeAsResource());

            w.setLayoutParams(lp);
            Log.d(TAG, "CustomView added!");    
      }

В своем основном задании я делаю следующее, чтобы проверить, доступен ли первый CustomView:

 customViewTest = (CustomView) (findViewById(customViewHandler.customViews.get(1).getId()));

        if ( customViewTest == null )
            Toast.makeText(this, "customViewTest == null", Toast.LENGTH_LONG).show();

Это всегда показывает тост,Что мне здесь не хватает?Нужно ли мне надувать или что-то?Должна быть предусмотрена возможность добавления пользовательских видов в макет программно.

1 Ответ

2 голосов
/ 19 марта 2012

Действительно, можно добавить виды к макету программным способом, но кажется, что вы вообще не добавляете виды к любому макету.Вы просто создаете список представлений.

Activity.findViewById вернет вам представление, если в его макете есть какое-то представление с конкретным идентификатором.Это означает, что представления, которые не являются частью иерархии основного представления, даже если они имеют правильный идентификатор, не будут найдены.

После того, как ваш «класс обработчика» выполнится, вы получите список осиротевших представлений, то есть они не имеют родительского представления, и, в частности, они не являются частью макета действия.

Учитывая, что вы хотите использовать их во фрагментах, это делаетНе имеет смысла добавлять их в основной макет мероприятия напрямую.Одним из преимуществ фрагментов является то, что вы можете управлять небольшими группами связанных представлений.Вы должны добавить свои собственные представления к представлению фрагмента, где он будет использоваться.Вы можете передать требуемые параметры во фрагмент и позволить ему построить эти представления.

...