В чем разница от раздувания активности и раздувания представления в андроиде? - PullRequest
2 голосов
/ 10 января 2012

Кажется, я не понимаю, возможно ли раздувать (включить) действие в другой вид деятельности.Я знаю, что могу накачать макет XML, это работает, но мне интересно, смогу ли я накачать действие.Например, у меня есть класс A, который расширяет Activity, и другой класс B, который расширяет ListActivity.Могу ли я включить и использовать в классе A, мой класс B?Это то, что я пробовал:

Класс A:

LayoutInflater inflater = (LayoutInflater) MyActivity.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    // inflate list
    BActivity list = new BActivity();

Класс B:

public class BActivity extends ListActivity {
  public void onCreate(Bundle bundle) {
    super.onCreate(bundle);

    List<Model> models= new ArrayList<Model>();
    models.add(new Model("John"));
    models.add(new Model("Cage"));

    setListAdapter(new MyAdapter(this, models));
    ListView list = getListView();
  }
}

и в XML (класс A XML): (для гдея хочу увидеть список)

 <view class="com.test.BActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >  </view>

Все это выдает ошибки:

Ошибка надувания класса BActivity

Действия объявлены вманифест.

Вы знаете, что я делаю неправильно?это не правильный способ раздувать другое занятие?Я использую Android 2.2 API 8. Спасибо за ваше время.

Ответы [ 2 ]

10 голосов
/ 10 января 2012

Ваше название вопроса и ваша проблема на самом деле не одно и то же.Для полноты я отвечу на оба вопроса.

В чем отличие от надувания активности и надувания представления в android?

Ответ - разницы нет.В конечном счете, они одинаковы по процессу и логике.Однако у Действия может быть много разных видов, и вы можете setContentView() несколько раз использовать несколько разных макетов или видов в зависимости от ваших потребностей.Для действия требуется ресурс макета, а представление может быть или не быть макетом.

Знаете ли вы, что я делаю неправильно?

Да.Абсолютно.

  1. Ваш код: BActivity list = new BActivity(); на самом деле не раздувает активность.Вы создаете действие, но не запускаете его.
  2. Ваш XML определяет BActivity как View, но ваш код определяет его как ListActivity.Это две разные вещи полностью.A ListActivity имеет a ListView (расширенный или другой);A ListActivity не является a ListView.
  3. Activity, а его подклассами являются Contexts, которые имеют жизненный цикл, управляемый ОС.Они содержат и говорят Views всех типов, но не являются самими представлениями.

это не правильный способ раздувать другое занятие?

Нет, сэр, но не бойтесь!Ответ не так уж и далек.

  1. ОТКРЫТЫЙ ОТВЕТ (для полноты) - Во-первых, чтобы начать другую активность, чтобы она была раздута, вы должны позвонить startActivity() от Context.Context может быть приложением, действием, Broadcast Reciever или любым другим компонентом приложения (Component = объявленный объект в манифесте вашего проекта Android).Таким образом, если вы действительно хотите начать новую деятельность, вы должны изменить BActivity list = new BActivity(); на:

    Intent _listActivity = new Intent();
    _listActivity.setClass(BActivity.class);
    startActivity(_listActivity);
    
  2. РЕАЛЬНЫЙ ОТВЕТ - Однако, так как вы хотите см. ваш Список в классе A, BActivity - это не Activity, а View.Это означает, что вы действительно хотите, чтобы он распознал ваш вид, и это другое решение.Измените public class BActivity extends ListActivity на public class BActivity extends ListView, и теперь у вас неожиданно появляется пользовательский вид !!Теперь все, что нам нужно сделать, это заставить Список работать.

  3. Построение представления - Представления отличаются от действий тем, что у них нет public void onCreate(Bundle bundle),Вместо этого все ваши вещи из BActivity.onCreate() будут помещены в конструктор.Но у вас нет подходящего конструктора ... хммм.Ну, есть три конструктора на выбор - добавьте один или все из следующих (сначала вам, вероятно, понадобится либо вариант 1, либо 2. Но вы не будете использовать оба одновременно подсказкаПодсказка, прочтите комментарии :

    //This constructor is used when the View is created from code (not XML!!)
    public BActivity(Context context)
    {
    }
    
    //This constructor is used when the View is created from XML (not code!!)
    public BActivity(Context context, AttributeSet attr)
    {
    }
    
    //This constructor is used when the View is created from XML with a Style defined in separate XML.
    public BActivity(Context context, AttributeSet attr, int defStyle)
    {
    }
    
  4. Раздувание активности = Раздувание вида У вас есть выбор, вы можете либо добавьте представление, или вы можете надуть представление. Существует множество вариантов для обоих. На основании вашего вопроса я предполагаю, что вы хотите надуть представление. Просто измените BActivity list = new BActivity(); наsetContentView(R.id.MyXML). MyXML, разумеется, будет именем вашего файла XML Layout. SetContentView откроет соответствующий View для вас (BActivity), используя 2-й конструктор из списка выше.

Важно понимать разницу между представлением и операциями. Процессы между ними очень похожи, но сами они имеют переплетенную, но отдельную цель.

  • Деятельность ДОЛЖНА иметь представление.
  • Представление ДОЛЖНО быть в контексте.
  • Деятельность - это контекст, но контекст также может быть одним из нескольких других возможных классов.
  • Оба могут быть накачаны с использованием LayoutInflater
  • . Activity имеет удобный метод, называемый setContentView, который может надувать весь файл XML.
  • Вид долженраздувать каждый просмотр вручную, используя LayoutInflater object.inflate().
  • Деятельность имеет жизненный цикл.Вместо этого у представления есть цикл отрисовки.

Для получения дополнительной информации, безусловно, читайте больше в ресурсах разработчиков Android.Однако некоторые из этих вещей изучаются только экспериментально.

Надеюсь, все это помогло!

FuzzicalLogic

0 голосов
/ 10 января 2012

Накачивание означает разбор XML-описания объекта и построение Java-объекта с описанными атрибутами. Действия не имеют подробного описания в XML и, следовательно, нет смысла их раздувать.

Вы можете отправить операцию A из операции B или использовать новую концепцию фрагмента, чтобы объединить несколько вложенных операций в операции.

Кстати, вы можете определить пользовательские представления (путем создания подкласса одного из классов представлений) и использовать его в своих макетах XML, просто укажите полный путь к классу, например, в макете вместо пусть скажут.

...