Android фрагмент, вид не удаляется
я разработал приложение, в котором у меня есть фрагмент транзакции,
MainActivity
содержит Fragment View
.
MainActivity
три Button
в верхней части экрана, которые остаются такими же, когда мы идем это Activity
в другой Fragment
, только MainActivity
Fragment
изменение части, когда мы нажимаем из трех.
но моя проблема в том, что когда я перехожу от этого MainActivity
to Fragment
при нажатии на First-Button
это нормально, но когда я нажимаю на Second-Button
, результат заменить экран с первого Fragment
в другой Fragment
.
она находится в том же Activity
так , я не могу удалить Fragment
через remove(fr).commit();
потому что если я это сделаю, то она становится неактивной может быть фрагмент удалить, так что не ответ на нажатием следующей кнопки.
общий результат, он отображается как FirstFragment
и NewFragment
экран , когда я перейду к NewFragment
как я удалить FirstFragment
экран ?
на MainActivity
три кнопки имеют следующие код для изменения фрагмента:
Основная Деятельность :
public class MasterActivity extends Activity {
ImageView imgOne, imgTwo, imgThree;
Fragment fr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_master);
imgOne = (ImageView) findViewById(R.id.imgOne);
imgTwo = (ImageView) findViewById(R.id.imgTwo);
imgThree = (ImageView) findViewById(R.id.imgThree);
imgOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
fr = new FirstFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.addToBackStack(null);
//fragmentTransaction.remove(fr).commit();
//getFragmentManager().beginTransaction().remove(fr).commit();
fragmentTransaction.commit();
}
});
imgTwo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
fr = new SecondFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.addToBackStack(null);
//fragmentTransaction.remove(fr).commit();
// getFragmentManager().beginTransaction().remove(fr).commit();
fragmentTransaction.commit();
}
});
его xml-файл, как показано ниже:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#000000"
android:gravity="bottom"
android:weightSum="3" >
<ImageView
android:id="@+id/imgOne"
android:layout_width="0dp"
android:layout_height="27dp"
android:layout_gravity="center"
android:layout_weight="1"
android:src="@drawable/img1" />
<ImageView
android:id="@+id/imgTwo"
android:layout_width="0dp"
android:layout_gravity="center"
android:layout_height="27dp"
android:layout_weight="1"
android:src="@drawable/img2"/>
<ImageView
android:id="@+id/imgThree"
android:layout_width="0dp"
android:layout_gravity="center"
android:layout_height="27dp"
android:layout_weight="1"
android:src="@drawable/img3" />
</LinearLayout>
<fragment
android:id="@+id/fragment_place"
android:name="packagename.FirstFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.87"/>
<LinearLayout/>
<LinearLayout/>
Первый Фрагмент :
public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View r = inflater.inflate(R.layout.first_fratgment, container, false);
return r;
}
}
Второй Фрагмент :
public class SecondFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View r = inflater.inflate(R.layout.second_fratgment, container, false);
return r;
}
}
но при нажатии на одну кнопку Fragment
кнопка к другому он отображает как первый, так и второй Fragment
экраны.
Итак, как его решить и как удалить первый вид при втором щелчке?
я использовал этот
fragmentTransaction.remove(fr).commit();
и
getFragmentManager().beginTransaction().remove(fr).commit();
но это не работает.
7 ответов
фрагмент, объявленный в макете, обрабатывается по-разному Android. Заменить
<fragment
android:id="@+id/fragment_place"
android:name="packagename.FirstFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.87"/>
С FrameLayout
, или подкласс ViewGroup
по вашему выбору, и обрабатывать все транзакции программно. Остальное выглядит хорошо для меня
лучше использовать viewGroup или layout/FrameLayout вместо фрагментов (фрагмент навигации по щелчкам кнопки в действии). Поскольку фрагменты имеют свой собственный жизненный цикл, а фрагменты содержат свои представления или не убиваются при переходе фрагментов в пределах действия.
хотя, если вы все еще хотите пойти с фрагментом, сначала загрузите фрагмент первого нажатия кнопки и обработайте события щелчка других двух кнопок, удалив ранее прикрепленный фрагмент (фрагмент прикрепленный к первому щелчку кнопки).
Это можно сделать с помощью:
getSupportFragmentManager().beginTransaction().remove(YOUR_FIRST_FRAGMENT).commit();
и после этого вы можете написать код для добавления фрагмента в этом месте,
getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit();
и, следовательно, это можно сделать для вашего третьего нажатия кнопки, просто нужно изменить фрагмент, прикрепленный ко второй кнопке.
Я надеюсь, что это поможет вам.
фрагменты, которые жестко закодированы в XML, не могут быть заменены. использовать FramLayout
вместо этого в качестве контейнера фрагментов.
в вашем XML заменить
<fragment
android:id="@+id/fragment_place"
android:name="packagename.FirstFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.87"/>
<LinearLayout/>
С
<FrameLayout
android:id="@+id/contentFragment"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="2" />
теперь, выполните следующий стиль кода для достижения вашей цели:
Сначала установите onClickListeners для всех изображений:
например:imgOne.setOnClickListener(this);
@Override
public void onClick(View v) {
Fragment fragment = null;
switch (v.getId()) {
case R.id.imgOne:
fragment = new Fragment1();
break;
case R.id.imgTwo:
fragment = new Fragment2();
break;
}
if (fragment != null) {
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.contentFragment, fragment).commit();
} else {
Log.e(LOG_TAG, "Error in fragment transaction.");
}
}
надеюсь, что это помогает.
вы можете использовать: getSupportFragmentManager().beginTransaction().remove(fragment).commit();
Надеюсь, это поможет.
внести необходимые изменения. Замените свою активность и xml на это. Он должен работать твердо, если вы это сделаете.
public class MasterActivity extends Activity {
ImageView imgOne, imgTwo, imgThree;
Fragment fr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_master);
imgOne = (ImageView) findViewById(R.id.imgOne);
imgTwo = (ImageView) findViewById(R.id.imgTwo);
imgThree = (ImageView) findViewById(R.id.imgThree);
getFragmentManager().beginTransaction().add(R.id.fragment_place, new FirstFragment()).commit();
imgOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.fragment_place, new FirstFragment()).commit();
}
});
imgTwo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.fragment_place, new SecondFragment()).commit();
}
});
xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#000000"
android:gravity="bottom"
android:weightSum="3" >
<ImageView
android:id="@+id/imgOne"
android:layout_width="0dp"
android:layout_height="27dp"
android:layout_gravity="center"
android:layout_weight="1"
android:src="@drawable/img1" />
<ImageView
android:id="@+id/imgTwo"
android:layout_width="0dp"
android:layout_gravity="center"
android:layout_height="27dp"
android:layout_weight="1"
android:src="@drawable/img2"/>
<ImageView
android:id="@+id/imgThree"
android:layout_width="0dp"
android:layout_gravity="center"
android:layout_height="27dp"
android:layout_weight="1"
android:src="@drawable/img3" />
</LinearLayout>
<FrameLayout
android:id="@+id/fragment_place"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.87"/>
<LinearLayout/>
<LinearLayout/>
когда я перехожу к NewFragment, как я удаляю первый экран фрагмента ?
ну вы можете сделать это, скрывая старые(первые) Fragment
источник
getSupportFragmentManager().beginTransaction().hide(getSupportFragmentManager()
.findFragmentById(R.id.the_id_of_my_first_fragment));
вы также можете получить его(первый фрагмент) обратно тот же подход источник
getSupportFragmentManager().beginTransaction().show(getSupportFragmentManager()
.findFragmentById(R.id.the_id_of_my_first_fragment));
этот подход покупает гибкость и не изменяет архитектуру и логику вашего приложения, а также одну строку работа
я всегда опаздываю на вечеринку (:
копировать и pest код в вашей кнопке нажмите событие.
fr = new FirstFragment();
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
это завершенная работа.