programowe tworzenie TextView i ustawianie id

0

Witam,
mam taki problem, tworzę programowo TextView i chcę mu nadać id

tvFirst.setId(1);

i w tej linii AndroidStudio pokazuje mi błąd.

Expected resource of type id

0

W res/values utwórz plik ids.xml, który może wyglądać np tak:

<resources>
        <item type="id" name="my_custom_tv" />
</resources>

Wtedy id ustawiasz tak:

tvFirst.setId(R.id.my_custom_tv);

Od Api 17 możesz użyć funkcji:

View.generateViewId()
0

Chcę zrobić coś takiego by po wpisaniu czegoś w TextEdit i wciśnięciu Buttona był tworzony TextView z tym tekstem z TextEdita.
I wszystko niby chodzi tak jak chcę tylko, że jak przekrzywię trochę telefon i zmieni się orientacja ekranu to wszystkie dodane TextView znikają. A jak próbuję dodać od nowa to pierwszy TextView pojawia się bez problemu ale przy drugim już pokazuje mi:

07-03 17:18:44.234  19045-19045/test.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: test.app, PID: 19045
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
            at android.view.ViewGroup.addViewInner(ViewGroup.java:3562)
            at android.view.ViewGroup.addView(ViewGroup.java:3415)
            at android.view.ViewGroup.addView(ViewGroup.java:3360)
            at android.view.ViewGroup.addView(ViewGroup.java:3336)
            at test.app.MainActivity.createButtonS(MainActivity.java:241)
            at test.app.MainActivity.access$200(MainActivity.java:19)
            at test.app.MainActivity$1.onClick(MainActivity.java:53)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5050)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

i wskazuje na linię:

rLayout.addView(tvText.get(0));

Moja funkcja do tworzenia TextView:

    private void createTV(){
        int left, top, right, bottom;
        makeToast(Integer.toString(idAL.size())+" /"+Integer.toString(rList.size()));
        if(idAL.size()<rList.size())
            idAL.add(View.generateViewId());
        rLayout = (RelativeLayout) findViewById(R.id.romanLayout);
        RelativeLayout.LayoutParams paramFirstButton = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT
        );


        paramFirstButton.addRule(RelativeLayout.ALIGN_PARENT_TOP);
        paramFirstButton.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        paramFirstButton.addRule(RelativeLayout.ALIGN_PARENT_START);
        left = 10;
        top = 10;
        right = 0;
        bottom = 0;
        paramFirstButton.setMargins(left, top, right, bottom);


        tvText.add(new TextView(this));
        tvText.get(0).setText(Integer.toString(rList.get(0)));
        tvText.get(0).setId(idAL.get(0));
        tvText.get(0).setTextColor(getResources().getColor(R.color.cText));
        tvText.get(0).setBackgroundColor(getResources().getColor(R.color.cButton));
        tvText.get(0).setHeight(getResources().getInteger(R.integer.bsizeRH));
        tvText.get(0).setWidth(getResources().getInteger(R.integer.bsizeRW));
        tvText.get(0).setLayoutParams(paramFirstButton);

        tvText.get(0).setGravity(Gravity.CENTER | Gravity.CENTER_VERTICAL);
        rLayout.addView(tvText.get(0));


        tvText.get(0).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removeButton();
                rList.remove(0);
                if (rList.size() > 0)
                    createButtonS();
            }
        });


        for(int i=2;i<=rList.size();i++){
            RelativeLayout.LayoutParams paramRemainderButton = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT
            );
            if(i%7==1){
                paramRemainderButton.addRule(RelativeLayout.BELOW, tvText.get(i-8).getId());
                paramRemainderButton.addRule(RelativeLayout.ALIGN_LEFT, tvText.get(i-8).getId()); //Right_of
                paramRemainderButton.addRule(RelativeLayout.ALIGN_START, tvText.get(i-8).getId()); //Right_of
                left = 0;
                top = 20;
                right = 0;
                bottom = 0;
            }else {
                paramRemainderButton.addRule(RelativeLayout.ALIGN_TOP, tvText.get(i-2).getId());
                paramRemainderButton.addRule(RelativeLayout.RIGHT_OF, tvText.get(i-2).getId()); //Right_of
                left = 10;
                top = 0;
                right = 0;
                bottom = 0;
            }
            paramRemainderButton.setMargins(left, top, right, bottom);

            tvText.add(new TextView(this));
            tvText.get(i-1).setText(Integer.toString(rList.get(i-1)));
            tvText.get(i-1).setId(idAL.get(i-1)); //View.generateViewId()
            tvText.get(i-1).setTextColor(getResources().getColor(R.color.cText));
            tvText.get(i-1).setBackgroundColor(getResources().getColor(R.color.cButton));
            tvText.get(i-1).setHeight(getResources().getInteger(R.integer.bsizeRH));
            tvText.get(i-1).setWidth(getResources().getInteger(R.integer.bsizeRW));
            tvText.get(i-1).setLayoutParams(paramRemainderButton);
            tvText.get(i-1).setGravity(Gravity.CENTER | Gravity.CENTER_VERTICAL);
            rLayout.addView(tvText.get(i-1));
            final int id_ =i-1;
            tvText.get(i-1).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    removeButton();
                    rList.remove(id_);
                    createButtonS();

                }
            });

        }


    }
0

Dostałeś komunikat The specified child already has a parent. Nie wiadomo, jaki masz layout. Czy masz jakiegoś XML-a? Możliwe, że próbujesz dodać widok do elementu, który może mieć tylko jedno dziecko. Są takie elementy w Androidzie - np. ScrollView. Poza tym, ten kod jest wyrwany z kontekstu. Nie widzę nigdzie definicji pola tvText i nie wiem, co to jest, a do niego próbujesz dodać TextView. Ponadto, masz w tym kodzie straszny bałagan i generalnie programowe tworzenie widoków, to nienajlepszy pomysł i sprawdza się jedynie w niewielu bardzo specyficznych sytuacjach. Zastanów się, czy możesz rozwiązać swój problem (niestety nie wiem, jaki on jest) w inny, lepszy i prostszy sposób.

0

@wiciu
Mam RelativeLayout zdefiniowany w pliku *main.xml * i w tym pliku mam mam zdefiniowany przycisk i pole edycyjne. Te *TextView *dodaje do tego RelativeLayout.
Gdy aplikacja jest świeżo otworzona to *Exception *nie występuje gdy dodaje kolejne TextView jednak gdy ekran zmieni orientację i wszystko zostanie wyczyszczone to pierwszy element zostaje dodany bez problemu, jednak przy próbie dodania drugiego występuje Exception. Zauważyłem też, że gdy zamiast używać View.generateViewId() do generowania id tworzonych elementów mam dla pierwszego elementu tvText.get(0).setId(1); dla kolejnych (tworzonych w pętli) tvText.get(i-1).setId(i); to problem nie występuje.

*tvText *jest *ArrayList<TextView> *

0

Ten kod wygląda obrzydliwie. Wywal to i użyj do tego xmla.

0

@niezalogowany
A jak w XML można dynamicznie tworzyć np. TextView?

0

Po co tworzyć dynamicznie textView? To się przydaje w bardzo niewielu sytuacjach. Co chcesz osiągnąć w aplikacji?

1 użytkowników online, w tym zalogowanych: 0, gości: 1