1

基本的に、私は4つのタブを含むタブアクティビティを持つアプリに取り組んでいます。また、actvityGroupを使用してアクティビティとbackKeypressed()メソッドを管理しています。

私のアプリが最初に起動すると、サーバーにリクエストが送信され、下の画像に示すように進行状況バーが表示されます(AsyncTaskを使用)。

ここに画像の説明を入力してください

この後、私の完全なUIは次のように表示されます

ここに画像の説明を入力してください

ボタン「GO」のクリックイベントで新しいアクティビティをロードします(コードは以下に示されています)

btnGo.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
                Intent bookSearchResultActivityIntent = new Intent();
                bookSearchResultActivityIntent
                        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                bookSearchResultActivityIntent.setClass(getParent(),
                        BookSearchResultActivity.class);
                bookSearchResultActivityIntent.putExtra("LANG", language);
                bookSearchResultActivityIntent.putExtra("SEARCH_KEYWORDS",
                        edTxt_SearchField.getText().toString());
                MyActivityGroup activityStack = (MyActivityGroup) getParent();
                activityStack.push("BooksSearchActivity",
                        bookSearchResultActivityIntent);

これが私のActivtyGroup.javaコードです

public class MyActivityGroup extends ActivityGroup {
    private Stack<String> stack;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (stack == null) {
                stack = new Stack<String>();
        }
        push("1stStackActivity", new Intent(this, Home.class));
    }

    @Override
    public void finishFromChild(Activity child) {
        pop();
    }

    @Override
    public void onBackPressed() {
        pop();
    }

    public void push(String id, Intent intent) {
        Window window = getLocalActivityManager().startActivity(id,
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
        if (window != null) {
            stack.push(id);
            setContentView(window.getDecorView());
        }
    }

    public void pop() {
        if (stack.size() == 1) {
            finish();
        }
        LocalActivityManager manager = getLocalActivityManager();
        manager.destroyActivity(stack.pop(), true);
        if (stack.size() > 0) {
            Intent lastIntent = manager.getActivity(stack.peek()).getIntent()
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            Window newWindow = manager.startActivity(stack.peek(), lastIntent);
            setContentView(newWindow.getDecorView());
        }
    }
}

さて、私の質問は、backKey()を押したときです。それは前の活動に来るべきです。

  • はい、前のアクティビティになりますが、サーバーにリクエストを再度送信し、進行状況バーを再度表示して、サーバーが応答を送信するまでロードします。それは私の時間を無駄にします。
  • HomeTabを一度だけロードしたい(アプリをプレイするとき)。何度も何度も
  • 私も追加しています

    setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

活動開始中

  • また、menifest.xmlファイルに次のコードを追加しました

    android:configChanges = "keyboard | headerboardHidden | orientation"

しかし、まだ機能していません。

これが私のホームタブのコードです(onCreateメソッドでサーバーにリクエストを送信します)

public class Home extends Activity {
    /** Called when the activity is first created. */
    static final String URL = "http://www.shiaislamiclibrary.com/requesthandler.ashx";
    static final String KEY_ITEM = "Book"; // parent node
    static final String KEY_BOOKAUTHOR = "BookAuthor";
    static final String KEY_BOOKDATEPUBLISHED = "DatePublished";
    static final String KEY_BOOKTITLE = "BookTitle";
    static final String KEY_BOOKCODE = "BookCode";
    static final String KEY_BOOKIMAGE = "BookImage";

    String searchLang;
    String searchKeywords;
    LayoutInflater inflater = null;

    ArrayList<String> BookTitle = new ArrayList<String>();
    ArrayList<String> BookCoverPhotos = new ArrayList<String>();
    ArrayList<String> BookAuther = new ArrayList<String>();
    ArrayList<String> BookPublishDate = new ArrayList<String>();
    ArrayList<String> ImageByte = new ArrayList<String>();
    ArrayList<Bitmap> bitmapArray = new ArrayList<Bitmap>();

    Context ctx = this;
    Activity act = this;
    Context context = Home.this;
    URL bookImageURL = null;
    Bitmap bitMapImage = null;

    Button btnGo;
    Spinner spnrLanguage;
    Spinner spnrBrowseBy;
    String language;
    EditText edTxt_SearchField;

    GridView gridView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // setContentView(R.layout.home_activity);
        View viewToLoad = LayoutInflater.from(this.getParent()).inflate(
                R.layout.home_activity, null);
        this.setContentView(viewToLoad);

        gridView = (GridView) findViewById(R.id.gridview);
        spnrLanguage = (Spinner) findViewById(R.id.spnrLanguage);
        spnrBrowseBy = (Spinner) findViewById(R.id.spnrBrowseBy);
        edTxt_SearchField = (EditText) findViewById(R.id.EditTxt_Search);
        btnGo = (Button) findViewById(R.id.btn_GO);

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        // checking for availbe internet Connection
        if (cm.getActiveNetworkInfo() != null
                && cm.getActiveNetworkInfo().isAvailable()
                && cm.getActiveNetworkInfo().isConnected()) {

            new UIThread().execute(URL, "Imam Ali");
        }

        gridView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
                    long arg3) {

                Toast.makeText(context, BookTitle.get(pos), Toast.LENGTH_SHORT)
                        .show();

                Intent bookSearchResultActivityIntent = new Intent();
                bookSearchResultActivityIntent.setClass(getParent(),
                        BookOverView.class);
                bookSearchResultActivityIntent.putExtra("BITMAP",
                        bitmapArray.get(pos));
                bookSearchResultActivityIntent.putExtra("BOOK_TITLE",
                        BookTitle.get(pos));
                bookSearchResultActivityIntent.putExtra("BOOK_AUTHOR",
                        BookAuther.get(pos));
                bookSearchResultActivityIntent.putExtra("BOOK_PUBLISH_DATE",
                        BookPublishDate.get(pos));

                MyActivityGroup activityStack = (MyActivityGroup) getParent();
                activityStack.push("BookOverViewActivity",
                        bookSearchResultActivityIntent);

            }
        });

        // //////////////////// Spinners handler/////////////////////////
        ArrayAdapter<String> adapterLanguage = new ArrayAdapter<String>(
                context, android.R.layout.simple_spinner_item, getResources()
                        .getStringArray(R.array.spnr_language_array));
        ArrayAdapter<String> adapterBrowseBy = new ArrayAdapter<String>(
                context, android.R.layout.simple_spinner_item, getResources()
                        .getStringArray(R.array.spnr_browse_array));
        spnrLanguage.setAdapter(adapterLanguage);
        spnrBrowseBy.setAdapter(adapterBrowseBy);

        spnrLanguage.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int pos,
                    long arg3) {
                Toast.makeText(getParent(),
                        spnrLanguage.getItemAtPosition(pos) + "",
                        Toast.LENGTH_SHORT).show();
                language = spnrLanguage.getItemAtPosition(pos).toString();
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {

            }
        });

        spnrBrowseBy.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int pos,
                    long arg3) {
                Toast.makeText(context,
                        spnrBrowseBy.getItemAtPosition(pos) + "",
                        Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {

            }
        });

        // ////////////////////Search Button Handler/////////////////

        btnGo.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                if (!edTxt_SearchField.getText().toString().equals("")) {
                    Intent bookSearchResultActivityIntent = new Intent();
                    bookSearchResultActivityIntent
                            .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    bookSearchResultActivityIntent.setClass(getParent(),
                            BookSearchResultActivity.class);
                    bookSearchResultActivityIntent.putExtra("LANG", language);
                    bookSearchResultActivityIntent.putExtra("SEARCH_KEYWORDS",
                            edTxt_SearchField.getText().toString());
                    MyActivityGroup activityStack = (MyActivityGroup) getParent();
                    activityStack.push("BooksSearchActivity",
                            bookSearchResultActivityIntent);

                } else {
                    Toast.makeText(context, "Search Field Empty",
                            Toast.LENGTH_SHORT).show();
                }

            }
        });

    }

    private class UIThread extends AsyncTask<String, Integer, String> {

        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            progressDialog = ProgressDialog.show(getParent(),
                    "Acumlating Books from server...",
                    "This may Take a few seconds.\nPlease Wait...");
        }

        @Override
        protected String doInBackground(String... params) {

            String URL = params[0];
            String searchKeywords = params[1];

            XMLParser parser = new XMLParser();
            String XMLString = parser.getXmlFromUrl(URL, searchKeywords,
                    searchLang);
            // Log.i("XML Response", XMLString);

            Document doc = parser.getDomElement(XMLString);

            NodeList nl = doc.getElementsByTagName(KEY_ITEM);

            // looping through all item nodes <item>
            for (int i = 0; i < nl.getLength(); i++) {
                Element e = (Element) nl.item(i);

                BookTitle.add(parser.getValue(e, KEY_BOOKTITLE));
                BookCoverPhotos.add("http://shiaislamicbooks.com/books_Snaps/"
                        + parser.getValue(e, KEY_BOOKCODE) + "/1_thumb.jpg");
                BookAuther.add(parser.getValue(e, KEY_BOOKAUTHOR));
                BookPublishDate.add(parser.getValue(e, KEY_BOOKDATEPUBLISHED));
                Log.i("URLs", BookCoverPhotos.toString());
            }
            for (int i = 0; i < BookAuther.size(); i++) {

                try {
                    bookImageURL = new URL(BookCoverPhotos.get(i));
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    Log.i("URL", "ERROR at image position" + i + "");
                }

                try {
                    bitMapImage = BitmapFactory.decodeStream(bookImageURL
                            .openConnection().getInputStream());
                    bitmapArray.add(bitMapImage);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Log.i("BITMAP", "ERROR" + i);
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            progressDialog.dismiss();
            ImageAdapter adapter = new ImageAdapter(getBaseContext(), act);
            gridView.setAdapter(adapter);
        }
    }

    public class ImageAdapter extends BaseAdapter {

        public ImageAdapter(Context c) {
            context = c;
        }

        // ---returns the number of images---
        public int getCount() {
            // return imageIDs.length;
            return bitmapArray.size();
            // return 6;
        }

        public ImageAdapter(Context ctx, Activity act) {

            inflater = (LayoutInflater) act
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        // ---returns the ID of an item---
        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        // ---returns an ImageView view---
        public View getView(int position, View convertView, ViewGroup parent) {

            // ImageView bmImage;

            final ViewHolder holder;
            View vi = convertView;
            if (convertView == null) {
                vi = inflater.inflate(R.layout.grid_style, parent, false);
                holder = new ViewHolder();
                holder.txt_BooksTitle = (TextView) vi
                        .findViewById(R.id.txt_BookTitle);

                holder.img_BookCoverPhoto = (ImageView) vi
                        .findViewById(R.id.imgBookCover);
                vi.setTag(holder);
            } else {

                holder = (ViewHolder) vi.getTag();
            }
            holder.txt_BooksTitle.setText(BookTitle.get(position) + "");
            holder.img_BookCoverPhoto.setImageBitmap(bitmapArray.get(position));
            return vi;
        }
    }

    class ViewHolder {
        TextView txt_BooksTitle;
        ImageView img_BookCoverPhoto;
    }
}
  • 私の活動グループのクラスを見て、私が何をすべきか教えてください。前もって感謝します
4

1 に答える 1

1

[ホーム]タブアクティビティでデータを読み込むときは、静的配列内にデータを配置します。

    ArrayList<String> BookTitle = new ArrayList<String>();
    ArrayList<String> BookCoverPhotos = new ArrayList<String>();
    ArrayList<String> BookAuther = new ArrayList<String>();
    ArrayList<String> BookPublishDate = new ArrayList<String>();
    ArrayList<String> ImageByte = new ArrayList<String>();
    ArrayList<Bitmap> bitmapArray = new ArrayList<Bitmap>();

コードをざっと見ただけで、それらを作成し、メソッドstatic ArrayList<...> ... = null;の内部を確認します。onCreate()

if(BookTitle == null)
{
    //needs init
    BookTitle = new ArrayList<String>();
    //perform connect to server and parse response.
}

アプリケーションアクティビティの[ホーム]タブを停止して再起動すると、データはすでにメモリ内にありif、古いデータを再利用するために保持する句をスキップします。

本当にアプリを強制終了する場合は、静的変数をクリアするようにしてください。終了ボタンをクリックするときに、静的メソッドを呼び出して静的変数を再度nullに初期化するか、たとえば12時間有効にする場合は、静的変数を記憶します。静的変数のタイムスタンプと、メインアクティビティを強制終了/一時停止するたびに、そのチェックを実行します(nullまたは日付がある場合、日付がある場合は12時間経過したかどうかを確認し、経過した場合は静的変数の内容をクリアします) )。

これは、すばやく簡単な方法です。もう1つの方法は、静的変数を処理したくない場合に、それらをアプリケーションデータベースに格納することです。

多くのオプションがあります。要点は、静的な「グローバル永続」データとしてマークするか、データベース/ファイルなどに保存する必要があるということです。

于 2012-11-27T10:21:57.700 に答える