пятница, 13 апреля 2012 г.

Хлебная Диета - приложение для учета потребляемых углеводов.


Наконец подошел тот момент, когда пора выпускать приложение в маркет.
Представляю вашему вниманию - Хлебная Диета - приложение для подсчета потребления углеводов.


Главный экран


 Справочник продуктов

Основной экран приложения


После публикации  добавлю ссылку на Google Play и выложу подробное описание.

Как начать программировать под android?

Прекрасная статья на тему - "Как начать писать под android" - http://derevyanko.blogspot.com/2010/10/android.html
Спасибо уважаемому dv

Подборка книг по android на русским языке


На мой взгляд лучшие книги по android на русском языке:
1. Google Android программирование для мобильных устройств (Голощапов А.Л., 2011, BHV Санкт-Петербург)
2. Разработка приложений для Android (С. Хашими, С. Коматинени, Д. Маклинr, 2011)
3. Android за 24 часа. Программирование приложений под операционную систему Google (Лорен Дэрси, Рид Групп, 2011)

Динамическое добавление компонентов

Это приложение наглядно показывает технологию, как можно с помощью кода (ручками) создать компоненты на форме приложения.
В первой вкладке простая кнопка, а во второй уже контейнер RelativyLayout c Button и EditText внутри.

Вот первый класс DynAdd.java:


package app.com.simp;
import android.app.TabActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.TabHost;
import android.widget.TableLayout;
import android.widget.TableRow;

public class TabLayoutTest extends TabActivity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //Определяем новый tabHost
        TabHost tabHost = getTabHost();
        TabHost.TabSpec spec;
        //Создаем сначала TabHost с вкладками
        //Page1
        spec = tabHost.newTabSpec("tag1").setIndicator("Page1")
                      .setContent(R.id.TabLayOne);
        tabHost.addTab(spec);
        //Page2
        spec = tabHost.newTabSpec("tag2").setIndicator("Page2")
        .setContent(R.id.TabLayTwo);
        tabHost.addTab(spec);  

        AddBut();
        AddRel();
        //Теперь займемся остальными вкладками
        
  }
    protected void AddBut()
    { TabHost tabHost = getTabHost();
        FrameLayout frameLayout = tabHost.getTabContentView();
        //TabLayOne
        TableLayout tabLayOne = (TableLayout)frameLayout.findViewById(R.id.TabLayOne );
        //Теперь создаем новую строчку (TableRow) в содержании TabHost'а
        TableRow tabRowOne = new TableRow(this);
        //В пустом TableLayout(TabLayOne) динамически создадим кнопку, которую вставим в TableRow
        Button DynBut = new Button(this);
        DynBut.setText("DynBut");
        //Тут важный момент: Нужно задать параметры размеров для новой кнопки,
        //для этого мы воспользуемся параметрами строки(TableRow.LayoutParams), котороую создали ранее,
        //так как кнопку мы добовляем именно в новый TableRow.
        DynBut.setLayoutParams(new TableRow.LayoutParams(
                 LayoutParams.WRAP_CONTENT,
                 LayoutParams.WRAP_CONTENT));
        //Добаляем в созданный tableRow новую кнопку  
        tabRowOne.addView(DynBut);
        //Сейчас, когда у нас есть готовая строка ей надо добавить в содержание первого Tabhost'a
        //Технология примерно такая же как и с кнопкой.
        tabLayOne.addView(tabRowOne,new TableLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
        
        //Теперь идем дальше, создадим реакцию на нажатие нашей новой кнопки  
        DynBut.setOnClickListener(new View.OnClickListener()
         {
           @Override
           public void onClick(View v)
             {
             AddBut();
             }
         });
    }
    protected void AddRel()
    
    {  
    TabHost tabHost = getTabHost();
    FrameLayout frameLayout = tabHost.getTabContentView();
    TableLayout tableLayout = (TableLayout)frameLayout.findViewById(R.id.TabLayTwo);
    TableRow tableRow = new TableRow(this);
    RelativeLayout DynBut1 = new RelativeLayout(this);//Контейнер,который мы будем копировать.
    //Параметры кнопки
    Button DynBut2 = new Button(this);//Новая кнопка
    DynBut2.setText("DynBut");//Текст в кнопке
    //"габариты" кнопки
    DynBut2.setLayoutParams(new RelativeLayout.LayoutParams(
            LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT));
    //Параметры строки
    EditText DynBut3 = new EditText(this);//Новый текстовый редактор
    DynBut3.setText("DynEdit");
    DynBut3.setLayoutParams(new TableRow.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));
    //Набор параметров ориентации компонента в контейнере.
    RelativeLayout.LayoutParams Pos = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.FILL_PARENT,
            RelativeLayout.LayoutParams.WRAP_CONTENT);
    Pos.setMargins(100, 20, 10, 20);//Задание параметров для позиционирования
    //которые мы будем прикурчивать к определенному компоненту
    //Параметры контейера
    DynBut1.setLayoutParams(new TableRow.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));
    DynBut1.addView(DynBut2,Pos);//Добавление кнопки(Button) в контейнер
    DynBut1.addView(DynBut3);//Добавление редактора строки(EditText) в контейнер
    tableRow.addView(DynBut1);//Добавление контейнера в строку в разметку TableLayout
        //Параметры для динамически созданной раметки
    tableLayout.addView(tableRow,new TableLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));
    //Обрабочик события при нажатии
    DynBut2.setOnClickListener(new View.OnClickListener()
    {
       @Override
       public void onClick(View v)
         {
              AddRel();//И реакцией на нажатие созданной нами кнопки станет вызов этой же самой функции.
             }
     });
    
    }
}


А вот и разметка main.xml :


   android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="5dp" >
            <TableLayout
              android:id ="@+id/TabLayOne"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">    
            </TableLayout>
            <TableLayout
              android:id="@+id/TabLayTwo"          
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">  
            </TableLayout>        
       </FrameLayout>        
</LinearLayout>  
</TabHost>


Источник - http://androidforums.ru/Dinamicheskoe-dobavlenie-komponentov-t7489.html