Custom View - Как мне установить их идентификаторы, чтобы их можно было найти с помощью findViewById ()? - PullRequest
5 голосов
/ 04 июня 2011

Итак, у меня есть настраиваемое представление, настроенное в коде (для него не определено макет XML), и мне интересно, как правильно определить идентификатор дочерних представлений.У меня DO есть xml-файл, определяющий id, похожий на этот ... Но, как я понимаю, по крайней мере, поскольку у меня нет xml-разметки, нет AttribSet для передачи ... так что мои конструкторы все простоТипы (контекстный контекст).

<resources>
    <item type="id" name="textview1"/>
    <item type="id" name="textview2"/>
</resources>

И мое представление выглядит примерно так:

public class MyView extends View {

    protected RelativeLayout baseLayout;
    protected TextView textView1;
    protected TextView textView2;

    public MyView(Context context) {
        super(context);
        LayoutParams fill = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
        setLayoutParams(fill);

        Resources res = getResources();

        baseLayout = new RelativeLayout(context);
        baseLayout.setLayoutParams(fill);

        textView1 = new TextView(context);
        textView1.setId(R.id.textview1);
        // other init stuff here

        textView2 = new TextView(context);
        textView2.setId(R.id.textview2);
        // other init stuff here

        baseLayout.addView(textView1);
        baseLayout.addView(textView2);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // *snip lots of stuff*

        baseLayout.draw(canvas);
    }

    // This is only here because findViewById() returns NULL when I search
    public TextView getTextView1() {
        return textView1;
    }

    // This is only here because findViewById() returns NULL when I search
    public TextView getTextView2() {
        return textView2;
    }

}

Вот действие, которое использует представление ..

public class MyActivity extends Activity {

    // This is only here because findViewById() returns NULL when I search
    private MyView myView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Resources res = getResources();

        myView = new myView(this);
        setContentView(myView);

        // This returns NULL.  :/       
        // final TextView textView1 = (TextView) findViewById(R.id.textView1);

        // This is only here because findViewById() returns NULL when I search..
        final TextView textView1 = myView.getTextView1();
        final Animation anim = AnimationUtils.loadAnimation(this, R.anim.my_animation);
        textView1.setAnimation(anim);
        anim.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationEnd(Animation _anim) {
                Log.v("InsideAnimation", "Animation ended");
                textView1.setVisibility(View.INVISIBLE);
            }
            @Override
            public void onAnimationRepeat(Animation _anim) {
                Log.v("InsideAnimation", "Animation repeated");
            }
            @Override
            public void onAnimationStart(Animation _anim) {
                Log.v("InsideAnimation", "Animation started");
            }
        });
        anim.reset();
        textView1.startAnimation(anim);
    }
}

Основная проблема заключается в том, что загружаемая мной анимация (которая определена в xml) и запускает абсолютно ничего не делает.Я получаю в журнале утверждение «анимация запущена», но это все.Это никогда не заканчивается и никогда ничего не делает, когда я подражаю этому.Это как будто начинается, но на самом деле не работает.Я думаю проблема в том, что, возможно, анимация ожидает использовать определения макета идентификатора XML для своей работы, но поскольку findViewById () возвращает NULL, я предполагаю, что часть повреждена (и, таким образом, анимацияне работает).Итак ... по крайней мере сейчас, я хочу выяснить, что я делаю неправильно с настройкой идентификатора, чтобы я мог заставить findViewById () возвращать правильное представление, а не NULL ... И тогда, возможно, анимация будет работать,(или если после этого он все еще не работает, мне придется взглянуть на определение анимации в коде также вместо xml)

Любая помощь или предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 04 июня 2011

Существует setID-метод для Java-кодирования представления.

0 голосов
/ 04 июня 2011

Я предполагаю, что ваш TextView не создан в данный момент. попробуйте запустить анимацию вне метода oncreate.

Кроме того, ваш MyView расширен от View, и вы создаете RelativeLayout внутри. Если вы сделаете это, вы также можете напрямую расширить свой класс из RelativeLayout, а затем сделать что-то вроде

mRelativeLayout = new MyRelativeLayout(context)
mRelativeLayout.findViewById(R.id.textview1)

также может быть проблемой, потому что вы не получили ссылку на свой RelativeLayout в своей деятельности. Хотя, скорее всего, мое первое предположение - решение ...

О, и вы могли бы просто создать свой RelativeLayout в XML. Я не вижу смысла в использовании программного макета здесь ...

...