1

首先非常感谢所有支持像我这样的新手。

我正在创建一个应用程序,其中我有以下场景:-

  1. 我有 HomeScreenActivity,它有代表类别的 gridview。
  2. 当我按下任何网格项目时,会加载一个名为“SubcategoryFragment”的片段,该片段在网格视图中显示子类别。
  3. 现在,当我单击任何子类别时,它会加载另一个名为“DetailsFragment”的片段。
  4. 在 DetailsFragment 的 onCreateView 方法中,我检查我要显示的数据是否存在于 DB 中。如果数据在数据库中,那么它只是在列表视图中加载。当我按下返回键时,一切正常,没有任何问题。
  5. 但是如果数据库中不存在数据,那么我执行一个从 Web 服务器获取数据的异步任务。数据来并正确显示。但是现在如果我按下后退按钮,它会显示空白屏幕。

我希望按下后退按钮时出现子类别片段,但它显示空白屏幕。

我搜索了很多并在过去 3 天里苦苦挣扎,但我无法弄清楚发生了什么。

请帮我。我在下面发布我的代码:-

HomeScreenActivity.java

import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuItem;

public class HomeScreenActivity extends Activity implements
        NavigationDrawerFragment.NavigationDrawerCallbacks {

    /**
     * Fragment managing the behaviors, interactions and presentation of the
     * navigation drawer.
     */
    private NavigationDrawerFragment mNavigationDrawerFragment;

    /**
     * Used to store the last screen title. For use in
     * {@link #restoreActionBar()}.
     */
    private CharSequence mTitle;

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

        mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager()
                .findFragmentById(R.id.navigation_drawer);
        mTitle = getTitle();

        // Set up the drawer.
        mNavigationDrawerFragment.setUp(R.id.navigation_drawer,
                (DrawerLayout) findViewById(R.id.drawer_layout));
    }

    @Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments

        Fragment fragment = null;
        switch (position) {
        case 0:
            fragment = HomeFragment.newInstance(position + 1);
            break; 
        default:
            break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();

            fragmentManager.beginTransaction()
                    .replace(R.id.container, fragment).commit();

        }
    }

    public void onSectionAttached(int number) {
        switch (number) {
        case 1:
            mTitle = getString(R.string.title_section1);
            break;
        case 2:
            mTitle = getString(R.string.title_section2);
            break;
        case 3:
            mTitle = getString(R.string.title_section3);
            break;
        }
    }

    public void restoreActionBar() {
        ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle(mTitle);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (!mNavigationDrawerFragment.isDrawerOpen()) {
            // Only show items in the action bar relevant to this screen
            // if the drawer is not showing. Otherwise, let the drawer
            // decide what to show in the action bar.
            getMenuInflater().inflate(R.menu.home_screen, menu);
            restoreActionBar();
            return true;
        }
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

HomeFragment.java

import java.util.List;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;

public class HomeFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    /**
     * Defining layout items.
     **/
    GridView gridView;

    /**
     * Returns a new instance of this fragment for the given section number.
     */
    public static HomeFragment newInstance(int sectionNumber) {
        HomeFragment fragment = new HomeFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public HomeFragment() {
    }

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

        View rootView = inflater.inflate(R.layout.fragment_home, container, false);

        ParikshaDbHelper parikshaDbHelper = ParikshaDbHelper.getInstance(getActivity().getApplicationContext());
        SQLiteDatabase db = parikshaDbHelper.getWritableDatabase();

        List<Category> categories = CategoryDao.getAllParents(db);
        if(categories.size() > 0){
            gridView = (GridView) rootView.findViewById(R.id.gridView1);

            gridView.setAdapter(new GridViewAdapter(getActivity(),R.layout.grid_item, categories));
            gridView.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View v,
                        int position, long id) {
                    Category category = (Category) parent.getItemAtPosition(position);
                    Fragment subCategoryFragment = SubcategoryFragment.newInstance(5);
                    if (subCategoryFragment != null) {
                        FragmentManager fragmentManager = getFragmentManager();
                        Bundle args = new Bundle();
                        args.putInt("catId", category.getCategoryId());
                        subCategoryFragment.setArguments(args);
                        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                        fragmentTransaction.replace(R.id.container, subCategoryFragment);
                        String randomName = MyStringRandomGen.generateRandomString();
                        fragmentTransaction.addToBackStack(randomName);
                        fragmentTransaction.commit();

                    }
                }
            });
        }  

        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((HomeScreenActivity) activity).onSectionAttached(getArguments().getInt(
                ARG_SECTION_NUMBER));
    }
}

SubcategoryFragment.java

import java.util.List;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;

public class SubcategoryFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";
    Integer category_id;

    /**
     * Defining layout items.
     **/
    GridView gridView;

    /**
     * Returns a new instance of this fragment for the given section number.
     */
    public static SubcategoryFragment newInstance(int sectionNumber) {
        SubcategoryFragment fragment = new SubcategoryFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public SubcategoryFragment() {
    }

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

        Bundle bundle = this.getArguments();
        category_id = bundle.getInt("catId");
        View rootView = inflater.inflate(R.layout.fragment_home, container, false);

        ParikshaDbHelper parikshaDbHelper = ParikshaDbHelper.getInstance(getActivity().getApplicationContext());
        SQLiteDatabase db = parikshaDbHelper.getWritableDatabase();

        List<Category> categories = CategoryDao.getAllChildrens(db, category_id);
        if(categories.size() > 0){
            gridView = (GridView) rootView.findViewById(R.id.gridView1);

            gridView.setAdapter(new GridViewAdapter(getActivity(),R.layout.grid_item, categories));
            gridView.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View v,
                        int position, long id) {
                    Category category = (Category) parent.getItemAtPosition(position);
                    Fragment detailsFragment = DetailsFragment.newInstance(6);
                    if (detailsFragment != null) {
                        FragmentManager fragmentManager = getFragmentManager();
                        Bundle args = new Bundle();
                        args.putInt("catId", category.getCategoryId());
                        detailsFragment.setArguments(args);
                        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                        fragmentTransaction.replace(R.id.container, detailsFragment);
                        String randomName = MyStringRandomGen.generateRandomString();

                        fragmentTransaction.addToBackStack(randomName);
                        fragmentTransaction.commit();         
                    }
                }
            });
        }  

        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((HomeScreenActivity) activity).onSectionAttached(getArguments().getInt(
                ARG_SECTION_NUMBER));
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("catId", category_id);
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            // Restore last state for checked position.
            category_id = savedInstanceState.getInt("catId");
        }
    }
}

详细信息Fragment.java

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;

public class DetailsFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";
    private static String KEY_SUCCESS = "success";
    private static String KEY_ERROR = "error";

    public ListView listView;
    public TextView txtCatName;
    public List<QuestAns> questAns;
    public CustomListViewArrayAdapter adapter = null;
    public Integer category_id;
    /**
     * Returns a new instance of this fragment for the given section number.
     */
    public static DetailsFragment newInstance(int sectionNumber) {
        DetailsFragment fragment = new DetailsFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public DetailsFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Log.e("DetailsFragment", "OnCreateView Called");
        View rootView = inflater.inflate(R.layout.fragment_details, container, false);
        listView = (ListView) rootView.findViewById(R.id.questListing);
        txtCatName = (TextView) rootView.findViewById(R.id.txtCatName);

        ParikshaDbHelper parikshaDbHelper = ParikshaDbHelper.getInstance(getActivity().getApplicationContext());
        SQLiteDatabase db = parikshaDbHelper.getWritableDatabase();

        Bundle bundle = this.getArguments();
        category_id = bundle.getInt("catId");
        Category category = CategoryDao.findById(db, category_id);
        List<QuestAns> questAns = QuestAnsDao.getAllByCategories(db, category_id);
        txtCatName.setText(category.getCategoryName());
        if(questAns.size() > 0){
            adapter = new CustomListViewArrayAdapter(getActivity()
                    .getApplicationContext(), R.layout.quesans_item,
                    questAns);

            listView.setAdapter(adapter);
        }else{
            NetAsync();
        }
        return rootView;
    }
    public void NetAsync() {
        new NetCheck().execute();
    }
    /**
     * Async Task to check whether internet connection is working
     **/
    private class NetCheck extends AsyncTask<String, Void, Boolean> {
        private ProgressDialog nDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            nDialog = new ProgressDialog(getActivity());
            nDialog.setMessage("Loading..");
            nDialog.setTitle("Checking Network");
            nDialog.setIndeterminate(false);
            nDialog.setCancelable(false);
            nDialog.show();
        }

        @Override
        protected Boolean doInBackground(String... args) {
            /**
             * Gets current device state and checks for working internet
             * connection by trying Google.
             **/
            ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnected()) {
                try {
                    URL url = new URL("http://www.google.com");
                    HttpURLConnection urlc = (HttpURLConnection) url
                            .openConnection();
                    urlc.setConnectTimeout(3000);
                    urlc.connect();
                    if (urlc.getResponseCode() == 200) {
                        return true;
                    }
                } catch (MalformedURLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return false;
        }

        protected void onPostExecute(Boolean th) {
            if (th == true) {
                nDialog.dismiss();
                new GetQuesAns().execute();
            } else {
                nDialog.dismiss();
            }
        }

    }
    private class GetQuesAns extends AsyncTask<String, Void, JSONObject> {
        /**
         * Defining Process dialog
         **/
        private ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(getActivity());
            pDialog.setTitle("Contacting Servers");
            pDialog.setMessage("Fetching Data....");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        protected JSONObject doInBackground(String... args) {
            CommonFunctions commonFunctions = new CommonFunctions();
            JSONObject json = commonFunctions.getQuesAns(category_id);
            return json;
        }

        protected void onPostExecute(JSONObject json) {
            /**
             * Checks for success message.
             **/
            try {
                if (json.getString(KEY_SUCCESS) != null) {
                    String res = json.getString(KEY_SUCCESS);
                    String red = json.getString(KEY_ERROR);
                    if (Integer.parseInt(res) == 1) {
                        pDialog.setTitle("Getting Data");
                        pDialog.setMessage("Loading Data...");
                        pDialog.dismiss();

                        JSONArray quest_ans = json.getJSONArray("quest_ans");
                        /* Clear all previous data in SQlite database.
                         **/
                        ParikshaDbHelper dbHelper = ParikshaDbHelper.getInstance(getActivity().getApplicationContext());
                        dbHelper.resetTables();
                        SQLiteDatabase db = dbHelper.getWritableDatabase();

                        if(quest_ans.length() > 0){
                            QuestAns questAns = new QuestAns();
                            for(int i=0; i<quest_ans.length(); i++){
                                JSONObject storeData = quest_ans.getJSONObject(i);

                                questAns.setId(storeData.getInt(ParikshaContract.QuestAns.COL_ID));
                                questAns.setCatId(storeData.getInt(ParikshaContract.QuestAns.COL_CAT_ID));
                                questAns.setQuestion(storeData.getString(ParikshaContract.QuestAns.COL_QUESTION));
                                questAns.setAnswer(storeData.getString(ParikshaContract.QuestAns.COL_ANSWER));

                                QuestAnsDao.insert(db, questAns);
                            }
                        }
                        List<QuestAns> questAns = QuestAnsDao.getAllByCategories(db, category_id);
                        if(questAns.size() > 0){
                            adapter = new CustomListViewArrayAdapter(getActivity()
                                    .getApplicationContext(), R.layout.quesans_item,
                                    questAns);
                            listView.setAdapter(adapter);
                        }
                        pDialog.dismiss();

                    } else if (Integer.parseInt(red) == 1) {
                        pDialog.dismiss();
                    }
                } else {
                    pDialog.dismiss();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((HomeScreenActivity) activity).onSectionAttached(getArguments().getInt(
                ARG_SECTION_NUMBER));
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("catId", category_id);
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            // Restore last state for checked position.
            category_id = savedInstanceState.getInt("catId");
        }
    }
}

我试过的: -

  1. OnBack 按片段显示空白屏幕
  2. 在按下后退按钮的片段中,活动为空白

请帮我追踪问题并解决它。

抱歉,如有任何打字或格式错误。

4

0 回答 0