Problem z dodaniem kolejnej Aktywnosci..

0

Kolejny raz mam problem ze swoja durnowata aplikacją. Tak więc po krótce, zrobiłem 2 apki. Jedna działa na PC (serwer), druga na Andku. Wysyłam sobie to co mnie interesuje z serwera na Andka, wszystko ładnie czyta i wyświetla. Jednak chciałem sobie dodać kolejną aktywność bezpośrednio powiązaną z pierwsza. Męczę się od jakiegoś czasu, żeby dodać kolejnego xmla z layoutem, na którym będzie wyświetlany tekst w stylu "Oczekiwanie na wiadomość" w momencie kiedy klient połączy się z serwerem, a zniknie gdy wyśle jakąkolwiek wiadomość. Chyba wiadomo o co chodzi :)

Wizualnie wyglada to tak, gdzie ten kolorek jest animowany:
http://img16.imageshack.us/img16/1021/screenshot2013010901414.png

Przed wyświetleniem wiadomości o w/w treści chciałbym, żeby pojawiło się okienko z ze statusem oczekiwania. Jest to o tyle problematyczne, że nie jestem zbytnio sobie sam poradzić ponieważ większość tutoriali dotyczy zmiany Aktywności przy pomocy guzika, a mnie taka opcja nie interesuje. Wszystko ma działać automatycznie, bez jakiejkowiek ingerencji ze strony użytkownika.

Kod:

Activity

package com.example.myactivity;


import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
 
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
 
public class MyActivity extends Activity
{
    private ListView mList;
    private ArrayList<String> arrayList;
    private MyCustomAdapter mAdapter;
    private TCPClient mTcpClient;
    private static Context context;
    
 
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
 
        arrayList = new ArrayList<String>();       
        mList = (ListView)findViewById(R.id.list);
        mAdapter = new MyCustomAdapter(this, arrayList);
        mList.setAdapter(mAdapter);
        
        new connectTask().execute("");
 
                mAdapter.notifyDataSetChanged();        
        
    }
 
    
    public class connectTask extends AsyncTask<String,String,TCPClient> 
    {
        
    	protected TCPClient doInBackground(String... message) 
        {
 
            mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() 
            {
            	               
                public void messageReceived(String message) 
                {
                    
                    publishProgress(message);
                                                     
                }
            });
            mTcpClient.run();
            
            
 
            return null;
        }
 
    
        protected void onProgressUpdate(String... values) 
        {
            super.onProgressUpdate(values);          
            arrayList.add(values[0]);          
            mAdapter.notifyDataSetChanged();
        }
        
    } 
}      

Adapter

package com.example.myactivity;


import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.CountDownTimer;
import android.os.Handler;
//import android.graphics.Paint;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;

import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;



 
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
 
public class MyCustomAdapter extends BaseAdapter 
{
    private ArrayList<String> mListItems;
    private LayoutInflater mLayoutInflater;
    private static Context context;
   
 
    public MyCustomAdapter(Context context, ArrayList<String> arrayList)
    {
    	
        mListItems = arrayList;
 
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);      
        
        
    }
 
    
   
    
    public int getCount() 
    {
        return mListItems.size();
    }
 
    
    public Object getItem(int i) 
    {
        return null;
    }
 
  
    public long getItemId(int i) 
    {
        return 0;
    }
 
   
   
    public View getView(final int position, View view, ViewGroup viewGroup) 
    {
    	
    	
        if (view == null) 
        {
            view = mLayoutInflater.inflate(R.layout.list_item, null);   
        }
     
  
         
        String stringItem = mListItems.get(position);
       
        
           
         if (stringItem != null ) 
        {
        	
            final TextView itemName = (TextView) view.findViewById(R.id.list_item_text_view);
            
                        
            Animation anim = new AlphaAnimation(0.0f, 1.0f);
            anim.setDuration(120);
            anim.setStartOffset(50);
            anim.setRepeatMode(Animation.REVERSE);
            anim.setRepeatCount(Animation.INFINITE);
              
            itemName.setText(stringItem); 
            
          
           
                
                if(position == 1 && stringItem.equals("Zielony"))
                {
                	itemName.setBackgroundColor(Color.GREEN);
                	itemName.startAnimation(anim);     
                	itemName.setBackgroundResource(R.drawable.green);  
                //	itemName.startAnimation(scale);
                
                
                }
                else if(position == 1 && stringItem.equals("Czerwony"))
                {
                	itemName.setBackgroundColor(Color.RED);
                	itemName.startAnimation(anim);
                	itemName.setBackgroundResource(R.drawable.red);
                //	itemName.startAnimation(scale);
                	
                	
                }
                else if(position == 1 && stringItem.equals("Niebieski"))
                {
                	itemName.setBackgroundColor(Color.BLUE);
                	itemName.startAnimation(anim);
                	itemName.setBackgroundResource(R.drawable.blue);
                //	itemName.startAnimation(scale);
                }
            //}
        }
        return view;
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="#FFFFFF"
              android:id="@+id/footer"                     
              android:gravity="bottom">

    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1.69"
        android:cacheColorHint="#FFFFFF"
        android:divider="@drawable/divider"
        android:footerDividersEnabled="false"
        android:headerDividersEnabled="false"
        android:listSelector="@android:color/transparent"
        android:smoothScrollbar="false"
        android:text="Loading..."
        android:textAlignment="center"
        android:transcriptMode="alwaysScroll" />
    
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_weight="0.16"
        android:src="@drawable/logo2" />
 
</LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/list_item"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:gravity="bottom" >

     
     
     <TextView
         android:id="@+id/list_item_text_view"
         android:layout_width="293dp"
         android:layout_height="177dp"
         android:layout_marginLeft="14dp"
         android:layout_marginRight="7dp"
         android:background="@drawable/rounded_edittext"
         android:gravity="center"
         android:padding="2dp"
         android:shadowColor="@color/orchid1"
         android:shadowDx="0"
         android:shadowDy="0"
         android:shadowRadius="5"
         android:textAlignment="center"
         android:textSize="25sp"
         android:textStyle="bold" />
     
 </LinearLayout>

Wszystko rozbija sie o kwestie odpowiednio napisanej klasy Activity, ktos ma jakies madre sugestie? Bede wdzieczny za podsuniecie pomyslow z jakimis probkami kodu bo raczej przegrzebalem caly internet i nic nie znalazlem, a kombinowalem na wiele sposobow.
A, jest jeszcze klasa odpowiedzialna za laczenie sie z serwerem ale z oczywistych powodow nie bede jej wrzucal :)

0

W takich sytuacjach używa się klasy Dialog.
Rozwiązaniem Twoich problemów jest stworzenie i wyświetlenie dialogu w onPreExecute w klasie connectTask

Dialog dialog = new Dialog(context);
dialog.setTitle("Please wait");
dialog.show();
 

i schowanie dialogu po zassaniu danych, w metodzie onPostExecute:

 
dialog.dismiss();
0

To jest mniejwiecej to czego szukalem, wielkie dzieki! Jednak pojawil sie problem. Rozumiem, ze funkcja ma wygladac w nastepujacy sposob:

public void setContext(Context context) {
		this.context = context;
	}


	public class connectTask extends AsyncTask<String,String,TCPClient> 
    {
    	Dialog dialog = new Dialog(context);
    	
    	protected void onPreEcexute()
  	  {
      	dialog.setTitle("Please wait...");
      	dialog.show();
  	  }
    	
    	protected TCPClient doInBackground(String... message) 
        {
    	
            mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() 
            {
            	
  
                public void messageReceived(String message) 
                {
                    publishProgress(message);
                                                   
                }
                
            });
            mTcpClient.run();
        //    onPostExecute(mTcpClient);
           
          
 
            return null;
        }
          
    	public void onPostExecute()
    	{  		
    		dialog.dismiss();
    	}
    
        protected void onProgressUpdate(String... values) 
        {
            super.onProgressUpdate(values);

            arrayList.add(values[0]);
            mAdapter.notifyDataSetChanged();
            
        }

    }

Apka nie rusza, wywala errora podczas uruchamiania (Niestety aplikacja MyActivity...), problem tkwi tutaj

Dialog dialog = new Dialog(context); 

jezeli odwoluje sie bezposrednio do Dialog dialog = new Dialog(MyActivity.this)

  apka rusza ale nic sie nie dzieje (nie wyswietla sie zaden dialog). Jakis pomysl?
0

Upewnij się, że Context który przekazujesz jest odpowiedni.
Bezpieczniej jest wywołać connectionTask w onStart(), zamiast onCreate().
Dlaczego? Poczytaj o cyklu życia Activity http://developer.android.com/reference/android/app/Activity.html

0

Chyba bede musial sie poddac. Nie jestem w stanie w zaden sposob wywolac Dialogu, a poki co moje mozliwosci raczej uniemozliwiaja mi odpowiednio zdiagnonowac przyczyne problemu. W kazdym razie dzieki wielkie za pomoc ;)

0

Jestem z siebie dumny, udało mi się rozwiązać mój problem. Z pozoru dość błacha sprawa. Napisze w czym rzecz, może kiedyś komuś to pomoże. W pierwszej kolejności, źle przekazywałem context. Brałem go z klasy MyActivity, natomiast powinien się tyczyć connectTask'a.

new connectTask(this).execute("");

public class connectTask extends AsyncTask<String,String,TCPClient> 
    {
		ProgressDialog dialog;
		private Context context;

		public connectTask (Context context) {
		       this.context = context;
		    }
	
       
    	@Override
		protected void onPreExecute() {
    		 dialog = ProgressDialog.show(context, "Komunikat", "Proszę czekać na wiadomość...");
			super.onPreExecute();
		}

.........

@Override
		protected void onPostExecute(TCPClient result) {
			
			super.onPostExecute(result);
			dialog.dismiss();
		}
	
    }
 

I to co tak na prawdę przez tyle czasu powodowało u mnie frustrację, to funkcja @Override. Dodałem ja do

onPostExecute()

i onPreExecute()

 przez PPM/Source/Override/Implemen Methods..., czego nie byłem w stanie ręcznie zrobić, ponieważ zaraz przy kompilowaniu wywalał błąd. Natomiast po usunięciu @Override.. program dalej działał tak jakbym sobie tego życzył? O co tu chodzi? Ktoś mógłby mi to ładnie wytłumaczyć bo totalnie nie czaje tego co się stało? I czemu do jasnej cholery przy zastosowaniu Override nagle pojawił się <i>progressDialog</i> ???
0

Override to nie funkcja, tylko adnotacja. Znaczy ona tyle co "chcę przesłonić metodę klasy nadrzędnej", więc jeśli dasz override i źle napiszesz sygnaturę funkcji (np. liczba argumentów różna od wersji z klasy bazowej) to kompilator zwróci błąd. Dlaczego nie działało bez override? Zapewne źle napisałeś ową sygnaturę i w klasie connectionTask miałeś 2 metody o tej samej nazwie, ale innej liczbie i/lub typie argumentów (co jest dopuszczalne w Javie). We "własnej" onPreExecute pokazywałeś Dialog, ale ta funkcja nigdy nie była wywoływana...

1 użytkowników online, w tym zalogowanych: 0, gości: 1