1

기본적으로 4 개의 탭을 포함하는 탭 활동이있는 앱에서 작업하고 있으며 또한 actvityGroup을 사용하여 활동을 관리하고 있습니다. 및 backKey pressed() 메서드.Android의 다른 활동에서 되돌아 왔을 때 Activity가 서버의 전체 데이터를 다시로드합니다.

내 응용 프로그램이 처음 시작되면 서버에 요청을 보내고 아래 그림과 같이 진행 막대를 표시합니다 (AsyncTask 사용). 그것은 "GO"버튼의 클릭 이벤트에 새로운 actvity로드

enter image description here

로이 후

enter image description here

내 전체 UI가 (코드는 아래와 같습니다)

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();를 누르면됩니다. 그것은 이전 행동에 올 것입니다.

  • 예 이전 활동에 있지만 서버에 다시 요청을 보내고 진행률 표시 줄을 다시 표시하고 서버가 응답을 보낼 때까지로드합니다. 그것은 내 시간을 낭비한다.
  • 저는 (앱을 재생할 때) 홈탭을 한 번만로드하려고합니다. 다시는 다시 나는 또한

    SETFLAGS (Intent.FLAG_ACTIVITY_CLEAR_TOP를)

  • 추가하고;

활동을 시작하는 동안

  • 또한

    안드로이드 menifest.xml 파일의 코드를 다음 추가 : configChanges = "키보드 | keyboardHidden | 오리엔테이션"

하지만, 아직 작동하지 않습니다.

여기가 (에서 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; 
    } 
} 
  • 내 활동 그룹 클래스의 모양과 내가 무엇을해야하는지 알려 주시기 바랍니다 있습니다. 미리 감사드립니다.
+0

, 데이타베이스/파일에 저장해야 할 것입니다 활동 의도를 시작한 다음 그것은 U로 작동해야합니다 –

+0

이므 란 u 조금 설명 해주겠습니까? –

답변

1

데이터를 홈 탭 활동에로드 할 때 일부 정적 배열에 넣으십시오.응용 프로그램 활동 홈 탭 중지 한 다음 다시 시작하면

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

, 데이터가 이미 메모리에있을 것입니다 :

코드에 대한 빠른 엿볼에서
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 절을 건너 뜁니다.

정말로 앱을 죽이고 싶을 때 정적 변수를 지우십시오. 종료 버튼을 클릭하거나, 정적 메소드를 호출하여 다시 null로 초기화하거나, 유효하게하려면 12라고 말하십시오. 시간, 정적 변수에 타임 스탬프를 암기하고 주 활동을 죽이거나 일시 중지 할 때마다 (주간 활동이 null이거나 날짜가있는 경우 날짜가 있으면 12 시간이 경과했는지 확인, 예이면 취소) 정적 변수 내용)

이것은 빠르고 쉬운 방법입니다. 또 다른 방법은 정적 변수를 다루지 않으려는 경우 응용 프로그램 데이터베이스에 저장하는 것입니다. 선택의 여지가 있습니다

는 점은 좀 모든`FLAG_ACTIVITY_CLEAR_TOP`의 FRM을 제거하면 정적으로 "글로벌 지속"데이터로 표시하거나 등

+0

이 좋은 해결책 인 것 같습니다. 그것을 시도하게하십시오. 덕분에 LonWolf –

+0

친애하는 그 어느 정도 작동합니다. 하지만 이전 활동으로 되돌아 가면 gridView를 채우지 않습니다. 빈 활동을 보여줍니다. 책을 표시해야합니다 (그림 2 참조). 도와주세요. –

+0

내가 작성한 수표 밖에서 그리드 뷰를 채우도록하십시오. 즉, 그리드 뷰에 자식이 있는지 확인하고 그렇지 않으면 정적 변수에있는 데이터로 채 웁니다. 함수 호출과 관련하여 코드에 약간의 오류가 있습니다. 전체 응용 프로그램을 종료하지 않는 한 정적 변수가 남아 있으므로 작업을 수행하십시오. 사용자의 경우 gridview가 다시 채워집니다. 나는 종종 onCreate() 메서드에서 두 가지 경우를 모두 확인하고 절대로 나를 실망시키지 않았습니다. – LonWolf

관련 문제