2013-07-24 6 views
0

У меня есть основное действие и 4 фрагмента. Я использую метод ft.replace(R.id.listFragment, myfragment); для переключения между фрагментами в основной деятельности. Один из моих фрагментов (фрагмент A) содержит представление списка и Iam с использованием адаптера массива для заполнения данных в listview. Теперь проблема заключается в том, что когда я выбираю «фрагмент А», это видно, и список отображается как обычный. Но когда я нажимаю кнопку «домой» и возобновляю приложение, приложение падает. И ошибка связана с адаптером массива в «фрагменте A». Я предоставление LogCat, а также «фрагментировать» .THANKS в advance.any помощь была бы оценена ...Фрагмент падает при возобновлении mainactivity

07-24 14:00:12.695: E/AndroidRuntime(25771): FATAL EXCEPTION: main 
07-24 14:00:12.695: E/AndroidRuntime(25771): java.lang.NullPointerException 
07-24 14:00:12.695: E/AndroidRuntime(25771): at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at com.glamzapp.saloon.AppoinAdapter.<init>(AppoinAdapter.java:47) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at com.glamzapp.saloon.Fragment_Appointments$GetAppointments.onPostExecute(Fragment_Appointments.java:192) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at com.glamzapp.saloon.Fragment_Appointments$GetAppointments.onPostExecute(Fragment_Appointments.java:1) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at android.os.AsyncTask.finish(AsyncTask.java:631) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at android.os.Looper.loop(Looper.java:137) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at android.app.ActivityThread.main(ActivityThread.java:5306) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at java.lang.reflect.Method.invokeNative(Native Method) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at java.lang.reflect.Method.invoke(Method.java:511) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
07-24 14:00:12.695: E/AndroidRuntime(25771): at dalvik.system.NativeStart.main(Native Method) 

Код:

public class Fragment_Appointments extends org.holoeverywhere.app.Fragment { 
ListView list; 
int ORDERDATE_FLAG = 1; 
public static String[] Customer = { "Christian Bale", "Megan Fox", 
     "BradPitt", "Christian Bale", "Megan Fox", "BradPitt" }; 
public static String[] Treatment = { "Golden Facial", "Chocolate Manicure", 
     "Face Massage", "Golden Facial", "Chocolate Manicure", 
     "Face Massage" }; 
public static String[] Specialist = { "Jacob", "Joseline", "Linda", 
     "Jacob", "Joseline", "Linda" }; 
public static String[] Date = { "20 Feb", "21 Feb", "21 Feb", "20 Feb", 
     "21 Feb", "21 Feb" }; 
public static String[] Status = { "Completed", "Not completed", 
     "Not completed", "Completed", "Not completed", "Not completed" }; 
public static String[] TimeSlot = { "12PM-1PM", "12PM-1PM", "1PM-2PM", 
     "12PM-1PM", "12PM-1PM", "1PM-2PM" }; 
public static String[] CustomerImage = { 
     "http://shpintv.com/images/2013/05/Christian-Bale-Wallpapers-.jpg", 
     "http://cdn-media.hollywood.com/images/l/MeganFox_620_092812.jpg", 
     "http://www.topnews.in/light/files/Brad-Pitt_49.jpg", 
     "http://shpintv.com/images/2013/05/Christian-Bale-Wallpapers-.jpg", 
     "http://cdn-media.hollywood.com/images/l/MeganFox_620_092812.jpg", 
     "http://www.topnews.in/light/files/Brad-Pitt_49.jpg" }; 
public static String[] Customer_Id = { ",1", "2", "3", "1", "2", "3" }; 
public static String[] Spec_Id = { ",1", "2", "3", "1", "2", "3" }; 
// public static String[] 
// Mast_CustName={"All","Megan Fox","Christian Bale","BradPitt"}; 
// public static String[] 
// Mast_SpecialistName={"All","Megan Fox","Christian Bale","BradPitt"}; 
public static String[] Mast_CustId = { "1", "2", "3" }; 
public static String[] Mast_SpecialId = { "1", "2", "3" }; 
public static String[] Mast_Status = { "All", "Completed", "Not Completed" }; 
public static String[] Mast_Treatment = { "All", "Golden Facial", 
     "Chocolate Manicure", "Face Massage" }; 
public static String speckey = "0", custkey = "0", statuskey = "0", 
     treatkey = "0"; 
ProgressBar progress; 
static ArrayList<String> Mast_CustName = new ArrayList<String>() { 
    { 

     add("Christian Bale"); 
     add("Megan Fox"); 
     add("BradPitt"); 

    } 
}; 
static ArrayList<String> Mast_SpecialistName = new ArrayList<String>() { 
    { 

     add("Jacob"); 
     add("Joseline"); 
     add("Linda"); 

    } 
}; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // Inflating layout 
    View v = inflater.inflate(R.layout.appoin_fragment, container, false); 
    // We obtain layout references 

    list = (ListView) v.findViewById(R.id.ARListView); 
    progress = (ProgressBar) v.findViewById(R.id.arProgressBar); 
    list.setEmptyView(v.findViewById(R.id.empty)); 

    if (Utils.isNetworkAvailable(getActivity())) { 
     new GetAppointments(getActivity()).execute(); 
    } else { 
     AlertDialog alertDialog = new AlertDialog.Builder(getActivity()) 
       .create(); 

     alertDialog.setMessage("No network connection!"); 
     alertDialog.setButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Add your code for the button here. 
       getActivity().finish(); 

      } 
     }); 
     alertDialog.show(); 
    } 

    return v; 

} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // Button reset=(Button)findViewById(R.id.reset); 

} 

public class GetAppointments extends AsyncTask<Void, Integer, Void> { 

    public GetAppointments(Activity activity) { 
     this.activity = activity; 

     context = activity; 
     dialog = new ProgressDialog(context); 

    } 

    /** progress dialog to show user that the backup is processing. */ 
    private ProgressDialog dialog; 
    /** application context. */ 
    private Activity activity; 
    private Context context; 

    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 

     progress.setVisibility(View.GONE); 



     AppoinAdapter adapter = new AppoinAdapter(getActivity(), Customer, 
       Treatment, Specialist, Date, Status, TimeSlot, 
       CustomerImage); 

     list.setAdapter(adapter); 
     list.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 

       Intent details = new Intent(getActivity(), 
         App_Details_Activity.class); 
       startActivity(details); 

      } 
     }); 



    } 
} 

А вот метод, который я использовал для переключить фрагмент в основной деятельности

fm = getSupportFragmentManager(); 
    ft = fm.beginTransaction(); 

    FragmentTransaction ft = MainActivity.fm.beginTransaction(); 

    Fragment_Appointments app = new Fragment_Appointments(); 
    ft.replace(R.id.listFragment, app); 
    ft.commit(); 

ответ

1

В ваших методах onPostExecute вы используете getActivity().

Даже если этот метод выполняется в основном потоке вашего приложения (uithread), нет гарантии, что действие будет создано в этот момент.

Действительно, если приложение перезагрузки AsyncTask onPostExecute можно назвать, когда активность еще в неопределенном состоянии или даже нулевой

+0

Спасибо за помощь, но как я могу это решить? –

+0

Продолжайте отслеживать экземпляр активности и заставьте задачу async ждать, пока она не будет нулевой. –

+0

Я использовал асинтез в maincativity для замены фрагмента. И проблема была решена. Спасибо за подсказку :) –

1

проблема заключается в том, что ваш фрагмент не добавляется к вашей деятельности, когда AsyncTask называют postExecute

+0

здесь это супер (контекст, R.layout.row_appointments, Заказчик); –

+0

@ Linh вы просите разъяснений. это должен быть комментарий. если у вас недостаточно репутации, кто-то попросит оп уточнить или опубликовать дополнительную информацию. удалить это. – Raghunandan

+0

проблема заключается в том, что ваш фрагмент не добавляется к вашей активности, когда асинхронный вызов postExecute –

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