Фрагмент Android, просмотр не удаляется
Я разработал приложение, в котором у меня есть транзакция фрагмента,
MainActivity
содержит Fragment View
.
MainActivity
имеют три Button
поверх экрана, которые остаются такими же, когда мы переходим этот Activity
к другому Fragment
, только часть MainActivity
Fragment
изменяется, когда мы выходим из трех.
Но, моя проблема в том, что когда я перехожу от этого MainActivity
в 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();
но он не работает.
Ответы
Ответ 1
Фрагмент, объявленный в макете, по-разному обрабатывается 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
по вашему выбору и программно обрабатывать все транзакции. Остальное выглядит хорошо для меня
Ответ 2
Лучше использовать группу viewGroup или layout/FrameLayout вместо фрагментов (перемещение фрагментов на нажатия кнопок в Activity). Поскольку фрагменты имеют свой собственный жизненный цикл и фрагмент, удерживают их или не убивают, когда вы выполняете переход фрагмента внутри действия.
Хотя если вы все еще хотите пойти с фрагментом, сначала загрузите фрагмент первой кнопки мыши и обработайте события щелчка других двух кнопок, удалив ранее прикрепленный фрагмент (Фрагмент прикреплен к первому нажатию кнопки).
Это можно сделать:
getSupportFragmentManager().beginTransaction().remove(YOUR_FIRST_FRAGMENT).commit();
и после этого вы можете написать код для добавления фрагмента в этом месте,
getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit();
и, следовательно, это может быть сделано для третьего нажатия кнопки, просто нужно изменить фрагмент, прикрепленный ко второй кнопке.
Надеюсь, это поможет вам.
Ответ 3
Фрагменты, жестко закодированные в 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.");
}
}
Надеюсь, что это поможет.
Ответ 4
вы можете использовать: getSupportFragmentManager().beginTransaction().remove(fragment).commit();
Надеюсь, это поможет.
Ответ 5
Внесите необходимые изменения. Замените свою активность и 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/>
Ответ 6
Когда я перехожу в NewFragment, как я удаляю первый экран frament?
Хорошо, вы можете это сделать, скрыв старый (первый) Fragment
getSupportFragmentManager().beginTransaction().hide(getSupportFragmentManager()
.findFragmentById(R.id.the_id_of_my_first_fragment));
вы также можете получить его (первый фрагмент) обратно тем же способом source
getSupportFragmentManager().beginTransaction().show(getSupportFragmentManager()
.findFragmentById(R.id.the_id_of_my_first_fragment));
Этот подход обеспечивает гибкость и не изменяет архитектуру вашего приложения и логику, а также одну строку работы
im всегда опаздывает на вечеринку (:
Ответ 7
код копирования и вредителя в событии нажатия кнопки.
fr = new FirstFragment();
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
завершена работа.