Мне нужно добавить поле EditText с относительной кнопкой при нажатии кнопки +

возможно, название моего вопроса не совсем понятно. Я разрабатываю свое первое приложение для Android для университетского проекта. Что мне сейчас нужно, так это дать возможность моим пользователям вводить один «ингредиент», чтобы искать рецепты в базе данных. Это просто.

Я прочитал, вероятно, все подобные сообщения на этом веб-сайте, но не смог решить свою проблему: теперь я хочу дать пользователю возможность указать более одного ингредиента, чтобы под моим первым полем EditText была кнопка «+», позволяющая чтобы добавить новые поля EditText между первым и самой кнопкой. Вместе с полем EditText мне нужна кнопка "-", которая при нажатии "скрывает" относительное поле ввода.

надеюсь описание понятно.

То, что у меня есть сейчас, это мой основной XML-макет и второй, с текстом редактирования и кнопкой "-"... но я не понял, как нажимать/раздувать/показывать этот макет в основном...

Не могли бы вы мне помочь? Это макет, который я хочу нажать:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_below="@+id/ingredient"
    android:layout_height ="wrap_content"
     android:layout_width="fill_parent"
     android:visibility="gone"
     android:id="@+id/newLine1">

 <EditText 
    android:id="@+id/ingredient"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:inputType="text"
    android:hint="@string/hint_ingredient" />
<Button 
    android:id="@+id/remove"
    android:layout_width="50dp"
    android:layout_height="wrap_content"
    android:text="@string/remove"
    android:layout_toRightOf="@+id/ingredient"
        android:onClick="removeLine"
    />

     </RelativeLayout>

Это основной макет:

 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/main_linear">


<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="0dip" 
android:scrollbars="horizontal"
android:id="@+id/scrollView"
android:layout_weight="1.0" android:fadingEdge="none">



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="300dp" android:layout_height="wrap_content" android:id="@+id/ingredients">

 <EditText 
    android:id="@+id/ingredient"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"

    android:inputType="text"
    android:hint="@string/hint_ingredient" />





</RelativeLayout>

</ScrollView>

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical" 
    android:layout_height ="wrap_content"
     android:layout_width="match_parent"
     android:id="@+id/buttons">

 <Button 
    android:id="@+id/add"
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:text="@string/add"
    />

   <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
     android:layout_below="@+id/add"

        android:text="@string/search" 

        />
   </RelativeLayout>
   </LinearLayout>

Как насчет удаления новых линий, добавленных инфлятором?

Пока решил так:

public void removeLine(View v)
    {
        View line = (View) v.getParent();
        line.setVisibility(View.GONE);
    }

Есть ли другой способ?


person Daniele Sottile    schedule 14.07.2012    source источник


Ответы (2)


В onClickListener для кнопки «+» вам нужно будет использовать LayoutInflater, чтобы раздуть макет вашего ингредиента в представление. Затем используйте findViewById(), чтобы получить ссылку на RelativeLayout ваших ингредиентов и добавить к ней новый вид.

Убедитесь, что вы указали LayoutParams для нового расширенного представления.

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

Удачи.

person Flynn81    schedule 14.07.2012
comment
Как у меня другой вопрос. Раздувание работает отлично, и я могу динамически добавлять то, что хочу. Теперь, как я описал в своем первом посте, мне нужно связать кнопку - рядом с каждым полем edittext. Как мне это сделать? похожих проблем не нашел... - person Daniele Sottile; 15.07.2012
comment
Во-первых, вам нужно присвоить каждому увеличенному представлению идентификатор (setId()), чтобы вы могли получить и удалить его. Установите тег каждой кнопки с идентификатором удаления на идентификатор увеличенного представления. Затем вам нужно каждый раз устанавливать onclicklistner для кнопки с удаленным идентификатором. В вашем методе onclick проверьте, удалили ли представление идентификатор, а затем, если это так, получите тег и используйте его для удаления представления. Удачи. - person Flynn81; 15.07.2012

в onClickListener к вашей кнопке «+» напишите что-то вроде этого:

int et_counter=1;
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);

EditText et = new EditText(RecipeActivity.this);
//assign them an ID with an int counter
//use this counter later to refer to the EditText
//to retrieve the values
et.setId(et_counter);

ll.addView(et);

вы можете получить такие значения:

for (n = 1; n <= et_counter; n++){
    et = (EditText) findViewById(n);
    String ingridient=et.getText().toString();
    //use the text somewhere
}

Точно так же вы можете назначить прослушиватель onClick вашей кнопке «-», обратиться к EditText с идентификатором, используя et_counter, и удалить его, используя et.setVisibility(View.GONE);

Вы должны быть в состоянии использовать это с вашей логикой. Удачи :-)

person Vinay W    schedule 15.07.2012