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/im[...]1/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/[...]nce/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, botów: 0