2014-10-23 2 views
0

Что происходит с парнямиМои фрагменты перекрываются на замену

Итак, у меня есть приложение с двумя вкладками и прокруткой навигации.

В моей первой вкладке (фрагменте) я добавил кнопку, которая, когда onClick, заменяет текущий фрагмент новым фрагментом, используя FragmentTransaction.replace(). Однако, что происходит, когда я нажимаю кнопку, фрагменты перекрывают друг друга. Я пробовал почти все, и я думаю, что это может иметь отношение к моим. XML-файлам.

Это то, что происходит:

Delivery fragment

Hitting "New Delivery" button. Половина нового фрагмента отображается.

Вот мой код:

MainActivity.java

package com.example.deliverytracker; 

import android.app.ActionBar; 
import android.app.ActionBar.Tab; 
import android.app.ActionBar.TabListener; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.view.ViewPager; 

public class MainActivity extends FragmentActivity implements TabListener { 

    ViewPager viewPager; 
    ActionBar actionBar; 
    FragAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Changes fragments by user swiping 
     adapter = new FragAdapter(getSupportFragmentManager()); 

     viewPager = (ViewPager) findViewById(R.id.pager); 
     viewPager.setAdapter(adapter); 
     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int arg0) { 
       actionBar.setSelectedNavigationItem(arg0); 
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) {} 

      @Override 
      public void onPageScrollStateChanged(int arg0) {} 
     }); 

     actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     ActionBar.Tab tab_deliv = actionBar.newTab().setText(R.string.tab_deliv); 
     ActionBar.Tab tab_cust = actionBar.newTab().setText(R.string.tab_cust); 

     tab_deliv.setTabListener(this); 
     tab_cust.setTabListener(this); 

     actionBar.addTab(tab_deliv); 
     actionBar.addTab(tab_cust); 

    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) {} 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     viewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {} 

} 

activity_main.xml

<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/pager" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    tools:context=".MainActivity" /> 

FragAdapter.java

package com.example.deliverytracker; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

public class FragAdapter extends FragmentPagerAdapter { 

    final int TOTAL_PAGES = 2; 

    public FragAdapter(FragmentManager fm) { 
     super(fm); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public Fragment getItem(int i) { 

     Fragment f = null; 

     // If position is 0, return Fragment A 
     if(i == 0){ 
      f = new FragmentDeliv(); 
     } 
     if(i == 1){ 
      f = new FragmentCustomers(); 
     } 

     return f; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return TOTAL_PAGES; 
    } 

} 

FragmentDeliv.java ЭТО ГДЕ Пытаюсь ЗАМЕНА ФРАГМЕНТ НА ​​КНОПКИ CLICK

package com.example.deliverytracker; 

import java.util.ArrayList; 

import android.os.Bundle; 
import android.support.v4.app.*; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 

public class FragmentDeliv extends Fragment { 

    private View view; 
    private Button newDeliv; 
    private ListView delivList; 

    public FragmentDeliv() { 
    // Required empty public constructor 
    } 

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

     view = inflater.inflate(R.layout.fragment_deliv, container, false); 

     setUpVars(); 

     newDeliv.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 

       FragmentAddDelivery fragment = new FragmentAddDelivery(); 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       ft.replace(R.id.frag_delivery, fragment, "tag"); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       //ft.hide(getFragmentManager().findFragmentByTag("tag")); 
       ft.addToBackStack("tag"); 
       ft.commit(); 
      } 

     }); 

     // Inflate the layout for this fragment 
     return view; 

    } 

    private void setUpVars() { 
     newDeliv = (Button) view.findViewById(R.id.btnAddDeliv);   
     delivList = (ListView) view.findViewById(R.id.listDeliv); 
     ArrayList<String> list = new ArrayList<String>(); 
     ArrayAdapter<String> listAdapter = 
       new ArrayAdapter<String>(this.getActivity(), 
             android.R.layout.simple_list_item_1, 
             list); 
     delivList.setAdapter(listAdapter); 

     list.add("fds"); 
     list.add("fds"); 
     list.add("fds");  
    } 


} 

fragment_deliv.xml

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

    <ListView 
     android:id="@+id/listDeliv" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" > 
    </ListView> 

    <Button 
     android:id="@+id/btnAddDeliv" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="4" 
     android:text="@string/add_delivery" /> 

</LinearLayout> 

FragmentAddDelivery.java

package com.example.deliverytracker; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.ScrollView; 

public class FragmentAddDelivery extends Fragment { 

    private EditText addr, city, apt, name, num, notes; 

    public FragmentAddDelivery() { 
     // Required empty public constructor 
    } 

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

     View view = inflater.inflate(R.layout.fragment_add_delivery, container, false); 

     addr = (EditText) view.findViewById(R.id.et_addr); 
     city = (EditText) view.findViewById(R.id.et_city); 
     apt = (EditText) view.findViewById(R.id.et_apt); 
     name = (EditText) view.findViewById(R.id.et_name); 
     num = (EditText) view.findViewById(R.id.et_num); 
     notes = (EditText) view.findViewById(R.id.et_notes); 

     return view; 
    } 

}

fragment_add_delivery.xml

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

    <EditText 
     android:id="@+id/et_addr" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="@drawable/rounded_edittext" 
     android:ems="10" 
     android:hint="Address (Required)" 
     android:inputType="textPersonName" /> 

    <EditText 
     android:id="@+id/et_city" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:ems="10" 
     android:hint="City (Required)" 
     android:inputType="textPersonName" /> 

    <EditText 
     android:id="@+id/et_apt" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:ems="10" 
     android:hint="Apt (Optional)" 
     android:inputType="textPersonName" /> 

    <EditText 
     android:id="@+id/et_name" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:ems="10" 
     android:hint="Name (Optional)" 
     android:inputType="textPersonName" /> 

    <EditText 
     android:id="@+id/et_num" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:ems="10" 
     android:hint="Number (Optional)" 
     android:inputType="phone" /> 

    <EditText 
     android:id="@+id/et_notes" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:ems="10" 
     android:hint="Notes (Optional)" 
     android:inputType="textPersonName" /> 

</LinearLayout> 
+0

вы можете разместить решение? – Manos

ответ

0

При добавлении фрагмента к раскладке деятельности путем определения фрагмента в файле макета XML, вы не можете удалить фрагмент во время выполнения. Если вы планируете включать и отключать свои фрагменты во время взаимодействия пользователя, , вы должны добавить фрагмент к активности, когда начинается первая активность , как показано на следующем уроке.

Creating a fragment

Учитывая вы определили <fragment> тег в вашем XML. Но из вашего кода кажется, что вы пытаетесь заменить родительский LinearLayout на фрагмент? Это не имеет смысла. Примеры @ Google помогут вам.

+0

Ах, невзирая на мой предыдущий комментарий Я немного устал. Поэтому моя цель - динамически добавлять фрагмент с помощью FragmentTransition. Мне нужен контейнер FrameLayout в моей линейной компоновке и передать это как первый параметр в .replace()? Позвольте мне взглянуть на это. – Daath

0

Итак, я понял.

То, что я сделал, было в адаптере фрагмента вместо того, чтобы возвращать фрагменты, которые я хочу отобразить для каждой соответствующей вкладки, я сделал пустой, корневой фрагмент для каждой вкладки, каждый из которых имеет свой собственный контейнер FrameLayout и ничего больше.

В классе корневого фрагмента у меня есть FragmentTransaction, которое заменяет корневой фрейм фрагментом, который я изначально хотел.

Таким образом, для любого фрагмента я хочу в данный момент отображается в этой вкладке, я просто обновить root_frame с новым фрагментом

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