所以我的主要活動包含兩個片段。在activity_main.xml佈局文件中,我有一個(List)片段,然後是一個框架佈局,它將充當第二個片段的容器。片段事務回棧不工作?
每次一個項目被點擊列表上片段列表視圖中,對應於該項目的詳細信息卡嗒一聲應與包含在幀佈局的第二片段被顯示。
這很好,工作的。但是,當我使用片段事務引用創建backStack時,backStack無法按預期工作。
我所期待的:
1)用戶點擊項目在列表視圖中,對應於itemClicked細節將在所述第二片段中顯示(與幀佈局)。
2)用戶點擊列表視圖中的另一個項目,與該項目對應的細節將被替換對應於前一點擊的細節。
3)用戶點擊後退按鈕和前一個項目點擊列表視圖將與對應於項目中的第二個片段的細節一起顯示。
什麼實際發生:
我重複步驟一和二以上。但是,在第3步中,應用程序將退出,如onStop方法被調用,然後是onDestroy方法。
這是主要活動。
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity implements WorkoutListFragment.WorkoutListListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void itemClicked(long id) {
WorkoutDetailFragment details = new WorkoutDetailFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
details.setWorkout(id);
ft.replace(R.id.fragment_container, details);
ft.addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
編輯:
(logcat的根據用戶要求):
08-27 22:18:10.850 12699-12699/? I/art﹕ Not late-enabling -Xcheck:jni (already on)
08-27 22:18:11.088 12699-12716/ramansb.workout D/OpenGLRenderer﹕ Use EGL_SWAP_BEHAVIOR_PRESERVED: true
08-27 22:18:11.092 12699-12699/ramansb.workout D/﹕ HostConnection::get() New Host Connection established 0xb3ee7f00, tid 12699
08-27 22:18:11.106 12699-12699/ramansb.workout D/Atlas﹕ Validating map...
08-27 22:18:11.169 12699-12716/ramansb.workout D/﹕ HostConnection::get() New Host Connection established 0xb3fef0a0, tid 12716
08-27 22:18:11.186 12699-12716/ramansb.workout I/OpenGLRenderer﹕ Initialized EGL, version 1.4
08-27 22:18:11.192 12699-12716/ramansb.workout D/OpenGLRenderer﹕ Enabling debug mode 0
08-27 22:18:11.217 12699-12716/ramansb.workout W/EGL_emulation﹕ eglSurfaceAttrib not implemented
08-27 22:18:11.217 12699-12716/ramansb.workout W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xb3fe5080, error=EGL_SUCCESS
編輯:
WORKOUT細節片斷:
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class WorkoutDetailFragment extends Fragment {
//All fragments require an empty constructor (no args)
public WorkoutDetailFragment(){}
private long workoutId;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(savedInstanceState != null){
workoutId = savedInstanceState.getLong("workoutId");
}
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_workout_detail, container, false);
}
public void onStart() {
super.onStart();
View view = getView(); //gets Fragment's root view, gets activity class name
if (view != null) {
TextView title = (TextView) view.findViewById(R.id.textTitle);
Workout workout = Workout.workouts[(int) workoutId];
title.setText(workout.getName());
TextView description = (TextView) view.findViewById(R.id.textDescription);
description.setText(workout.getDescription());
}
}
public void setWorkout(long id){
this.workoutId = id;
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putLong("workoutId", workoutId);
}
}
WORKOUTLIST片斷:
import android.app.Activity;
import android.app.ListFragment;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
/**
* A simple {@link Fragment} subclass.
*/
//Extends ListFragment as the fragment is a list fragment
public class WorkoutListFragment extends ListFragment{
interface WorkoutListListener{
void itemClicked(long id);
}
private WorkoutListListener listener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//The activity has implemented the WorkoutListListener interface therefore it can be casted to a type of WorkoutListListner
this.listener = (WorkoutListListener) activity;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if(listener != null){
listener.itemClicked(id);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//Creating array of workout names
String[] names = new String[Workout.workouts.length];
for(int i=0; i<names.length; i++){
names[i] = Workout.workouts[i].getName();
}
//Creating ArrayAdapter, such that the ListView(Subclass of adapter view) can use data from a java Array.
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(inflater.getContext(), android.R.layout.simple_list_item_1,
names);
setListAdapter(listAdapter);
return super.onCreateView(inflater, container, savedInstanceState);
//Calling the super class returns the default layout for ListFragments
}
}
WORKOUT類包含數據:
公共類鍛鍊{
private String name;
private String description;
public static final Workout[] workouts = {
new Workout("The Limb Loosener", "5 Handstand push-ups\n10 1-legged squats\n15 Pull-ups"),
new Workout("Core Agony", "100 Pull-ups\n100 Push-ups\n100 Sit-ups\n100 Squats"),
new Workout("The Wimp Special", "5 Pull-ups\n10 Push-ups\n15 Squats"),
new Workout("Strength and Length", "500 meter run\n21 x 1.5 pood kettleball swing \n21 x pull-ups")
};
//Each Workout has a name and description
private Workout(String name, String description){
this.name = name;
this.description = description;
}
public String getDescription(){
return description;
}
public String getName(){
return name;
}
public String toString(){
return this.name;
}
}
什麼日誌貓說,在Nexus 7 4.4.4物理設備和Nexus測試得到的錯誤?複製/粘貼到此處請 – Tudor
@PopTudor的logcat在編輯 – RamanSB
我想看到你的片段類,因爲我設法複製您的程序,並給我它的工作正常的添加,沒有問題... – Tudor