2013-07-10 3 views
18

Я знаю следующее сообщение: Using Multiple Fragments in an single activityAndroid Два фрагмента в той же активности

То, что я ищу это конкретный ответ на конкретную проблему. Результатом следующего кода является пустой FragmentActivity. Что мне не хватает в моем следующем коде, чтобы заставить его отобразить действие с двумя фрагментами. Один из них - пустой фрагмент списка, другой - фрагмент, который содержит поле ввода и кнопку в горизонтальной компоновке (этот макет можно найти на http://developer.android.com/training/basics/firstapp/starting-activity.html), который я хочу поместить абсолютно в нижней части экрана с фиксированным высота около 25 градусов.

Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.my.package" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.my.package.Application" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Моя основная деятельность и связанная с ним application.xml файл.

package com.my.package; 

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentTransaction; 

public class Application 
extends FragmentActivity 
implements MessageListViewFragment.OnLineSelectedListener, 
SendMessageFragment.OnSendButtonPressed { 

    MessageListViewFragment mMessageListFragment; 
    SendMessageFragment mSendMessageFragment; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.application); 

     mMessageListFragment = new MessageListViewFragment(); 
     mSendMessageFragment = new SendMessageFragment(); 

     FragmentTransaction transaction = 
       getSupportFragmentManager().beginTransaction(); 

     transaction.add(R.id.message_fragment, mMessageListFragment); 
     transaction.add(R.id.send_fragment, mSendMessageFragment); 

     transaction.commit(); 
    } 

    @Override 
    public void onListItemSelected(int position) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSendButtonPressed() { 
     // TODO Auto-generated method stub 

    } 
} 

Планировка:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:baselineAligned="false" 
    android:orientation="vertical" > 

    <fragment 
     android:id="@+id/message_fragment" 
     android:name="com.example.android.fragments.MessageListViewFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="top" /> 

    <fragment 
     android:id="@+id/send_fragment" 
     android:name="com.example.android.fragments.SendMessageFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="bottom" /> 

</LinearLayout> 

И теперь для двух фрагментов и связанных с ними файлов XML: первый фрагмент (список фрагментов сверху)

package com.my.package; 

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class MessageListViewFragment extends ListFragment { 
    OnLineSelectedListener mCallback; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      mCallback = (OnLineSelectedListener)activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnLineSelectedListener"); 
     } 
    } 

    // Container Activity must implement this interface 
    public interface OnLineSelectedListener { 
     public void onListItemSelected(int position); 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, 
      ViewGroup container, Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.list_fragment, null); 
    } 
} 

Планировка:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

второй фрагмент (внизу)

package com.my.package; 

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class SendMessageFragment extends Fragment { 
    OnSendButtonPressed mCallback; 

    // Container Activity must implement this interface 
    public interface OnSendButtonPressed { 
     public void onSendButtonPressed(); 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, 
      ViewGroup container, Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.input_fragment, null); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      mCallback = (OnSendButtonPressed)activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnHeadlineSelectedListener"); 
     } 
    } 
} 

Планировка:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 
    <EditText android:id="@+id/edit_message" 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:hint="@string/edit_message" /> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button_send" /> 
</LinearLayout> 
+2

хорошо, вы уже жестко закодировали фрагменты в своем xml, чтобы не добавлять их снова в свой код. – tyczj

+0

Если я удалю их из XML, это сработает? –

+0

сохранить xml просто удалить код и посмотреть, что произойдет – tyczj

ответ

25

Выполните следующие действия:

  1. Изменение Fragment к FrameLayout в основной деятельности XML, для обоих.
  2. Изменить layout_width от fill_parent до match_parent, для обоих FrameLayout в основном файле XML (которые созданы на шаге 1).
  3. layout_height от fill_parent до wrap_content, для обоих FrameLayout в основном файле XML (созданные на этапе 1).
  4. Изменить FrameLayout на ListView в списке Фрагмент XML, потому что это список.
  5. Измените идентификатор этого LisView на @android:id/list, поскольку он необходим для ListFragment.

Тогда дайте мне знать, Cheers.

Edit, а также следующие:

  1. Изменение return inflater.inflate(R.layout.list_fragment, null); в return inflater.inflate(R.layout.list_fragment, container, false);.
  2. Изменение return inflater.inflate(R.layout.input_fragment, null); в return inflater.inflate(R.layout.input_fragment, container, false);

Edit:

Сделайте свой основной файл активности XML следующим образом:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <FrameLayout 
     android:id="@+id/message_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <FrameLayout 
     android:id="@+id/send_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" /> 

</RelativeLayout> 

Я вынул android:name"...", потому что я не знаю, что это ни чтобы узнать, что это такое, если вы точно знаете, что он делает, просто добавьте его обратно, должно быть все в порядке.

+0

Кнопка теперь отображается в верхней части экрана activitie без редактирования строки. Как изменение основных файлов xml-активности из фрагментов в FrameLayouts сохраняет их как фрагменты. Это отличается от учебника на http://developer.android.com/training/basics/fragments/index.html –

+0

FrameLayout более общий, в любом случае это не должно сильно повлиять, Google использовал FrameLayout в другом учебнике. Я добавил отредактировать ответ для размещения второго макета внизу. – LuckyMe

+0

Здесь http://developer.android.com/training/implementing-navigation/nav-drawer.html#DrawerLayout более сложный макет, они использовали FrameLayout как окно для фрагмента. – LuckyMe

Смежные вопросы