Activity in einem Fragment

A

AndrejEdd

Neues Mitglied
0
Hallo zusammen

Meine Aufgabe für die Schule:
Ich muss eine Android Applikation programmieren welche die eigenen Kontakte welche diese Applikation auch besitzen (wie bei Whatsapp) anzeigen. Beim klicken auf einen Kontakt kann man ein bild auswählen das dann an diesen Kontakt gesendet wird.

Ich habe die ganze Logik und verstehe auch wie ich das umsetzten kann. Ich habe es hingebracht die Kontakte anzeigen zu lassen welche diese Applikation besitzen.

Mein Problem: Ich will eine Switch Tabbed Activity benutzen mit 3 Tabs (Fragments), das was ich bisher programmiert habe ist aber in einer Activity, nun das alles von einer Activity auf ein Fragment umzuwandeln erscheint mir schwierig. Ich habe gedacht ob es möglich sei, die actitivy in ein Fragment zu platzieren? falls ja, wie kann ich das machen?
 
Nein du kannst keine Activity in einem Fragment platzieren.
Und das Umwandeln einer Activity in ein Fragment ist etwas arbeit. Klappt aber meist Problemlos, da der LifeCycle sehr ähnlich ist.

lg.
 
Das problem liegt daran das in meiner Activity ein onPostExecute vorhanden ist bzw. in meiner Activity sind zwe Klassen vorhanden und in der einen Klasse geht es rein um die Verbindungübers Internet wie kann ich das dann in ein Fragment umwandeln?
 
Dazu müsstest du uns mal deinen Code zeigen ;)
 
MainActivity
Code:
package com.gibb.pickick;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;


public class MainActivity extends Activity {
    SimpleAdapter adpt;
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button aktualisieren = (Button) findViewById(R.id.aktualisieren);
        aktualisieren.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 (new SubConnectToDB()).execute();

            }
        });
        adpt  = new SimpleAdapter(new ArrayList<Contact>(), this);
        ListView lView = (ListView) findViewById(R.id.listView1);
         
        lView.setAdapter(adpt);
        
        // Exec async load task
        (new SubConnectToDB()).execute();
        
        
        lView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                
                Intent intent = new Intent(MainActivity.this, Debug_activity.class);
                startActivity(intent);

            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @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);
    }
    
    private class SubConnectToDB extends AsyncTask<Void, Void, List<Contact>>{
        private final ProgressDialog dialog = new ProgressDialog(MainActivity.this);
        
        @Override
        protected void onPreExecute() {       
            super.onPreExecute();
            dialog.setMessage("Kontake werden geladen...");
            dialog.show();           
        }

        @Override
        protected List<Contact> doInBackground(Void... params) {
            Context context = getApplicationContext();            
            TelephonyManager tMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            String ownNumber = tMgr.getLine1Number();
            ValueParser pars = new ValueParser();
            ownNumber = pars.parseOwnNumber(ownNumber);
            ArrayList<Contact> myArr = new ArrayList<Contact>();
            

            if(ownNumber != null) {
                Connection connect = new Connection();

                String phoneNumber = "";
                    
                Cursor cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
                while (cursor.moveToNext()) 
                {
                    phoneNumber = pars.getNumber(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                    
                    if (connect.existNumber(phoneNumber)) {
                        Contact contact = new Contact();
                        contact.setFirstName(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))); 
                        contact.setLastName(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)));
                        Log.d("OnClick: ", phoneNumber + " : " + contact.getFirstName());
                        contact.setPhoneNumber(phoneNumber);
                        myArr.add(contact);
                    }
                }        

                connect.saveContactsInDatabase(ownNumber, myArr);    
    
                  
                Log.d("OnClick: ", "Position: " + connect.existNumber("0552632541"));

                return connect.getContactListFromDatabase(ownNumber);
                
            } else {
                Toast toast = Toast.makeText(getApplicationContext(), "You haven't a number !", Toast.LENGTH_SHORT);
                toast.show();
            }
                
            return null;
        }

        @Override
        protected void onPostExecute(List<Contact> result) {
            super.onPostExecute(result);
            dialog.dismiss();
            adpt.setItemList(result);
            adpt.notifyDataSetChanged();           
        }
        
    }
}
 
Hallo, wie es bereits schon beschrieben wurde, lässt sich eine Activity nicht im Fragment einbinden (genau andersrum ist es...)
Du hast schon eine notifyDataSetChanged in onPostExecute() - daher wäre mein Vorschlag, dass du jetzt noch ein Interface anlegst, so dass dieses die Botschaft "fertig mit Task" in andere Klassen übermittelt.

Sind wahrscheinlich insgesamt 10 Zeilen Code und funktioniert meiner Meinung nach mit Abstand am besten.

Kurze Anleitung wie so was aussehen kann:

1. ein neues Interface (zB CompleteListener) anlegen.
Das Interface bekommt eine public Methode namens onComplete();

2. dein AsyncTask bekommt eine Funktion
Code:
setOnCompleteListener(CompleteListener listener){return this.listener = listener};
und dementsprechend noch einen Member namens
Code:
CompleteListener listenerer

3. wenn onPostExecute aufgerufen wird, rufst du die Methode im Interface auf (also dort sollte dann "listener.onComplete();" stehen.

4. in einen "Hosts" (also alle Klassen, die den AsyncTask bereitstellen) startest du den Task mit
Task task = new Task();
task.setOnCompleteListener(this); // <- hier wird dich die IDE drauf aufmerksam machen, dass der dein Host noch das "implements" CompleteListener vermisst.

Also 1x Alt-Enter und die Sache sollte passen :smile:
 
Zuletzt bearbeitet:
Ich habe deinen Code nur überflogen, aber du machst doch nichts andere als Kontakte laden und anzeigen oder?
Das kannst du problemlos für den Anfang in ein Fragment schieben. Natürlich kannst du das ganze schön in Helper/Util-Klassen (das Wort Service möchte ich hier vermeide, da es zweitdeutig wird) auslagern. Dann wird auch der Code besser lesbar.

lg.
 
Hehe, gerade am Anfang sind Fragmente und die Kommunikation von denen untereinander ein ziemlicher Brainfuck.
:)
 
missspelled ich verstehe bei deiner anleitung nicht den zusammenhang zwischen der activity und dem fragment .. also ich habe die Activity nun in ContactActivity umbenannt... nun will ich diese Activity als eins dieser 3 Fragmente die im Tabbed activity vorkommt anzeigen ... die contact activity steht noch und ist fehler frei ... das mit dem interface verstehe ich aber ich sehe denn zusammenhang zum fragment nicht ... und punkt 4 denn du hier erklärst ...

hier nochmal der code

MainActivity (Tabbed Activity)
Code:
package com.gibb.picturekicker;

import java.util.Locale;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.FragmentPagerAdapter;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity implements ActionBar.TabListener {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link FragmentPagerAdapter} derivative, which will keep every
     * loaded fragment in memory. If this becomes too memory intensive, it
     * may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    ViewPager mViewPager;

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

        // Set up the action bar.
        final ActionBar actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        // When swiping between different sections, select the corresponding
        // tab. We can also use ActionBar.Tab#select() to do this if we have
        // a reference to the Tab.
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });

        // For each of the sections in the app, add a tab to the action bar.
        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
            // Create a tab with text corresponding to the page title defined by
            // the adapter. Also specify this Activity object, which implements
            // the TabListener interface, as the callback (listener) for when
            // this tab is selected.
            actionBar.addTab(
                    actionBar.newTab()
                            .setText(mSectionsPagerAdapter.getPageTitle(i))
                            .setTabListener(this));
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @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);
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in
        // the ViewPager.
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).
            return PlaceholderFragment.newInstance(position + 1);
        }

        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
                case 0:
                    return getString(R.string.title_section1).toUpperCase(l);
                case 1:
                    return getString(R.string.title_section2).toUpperCase(l);
                case 2:
                    return getString(R.string.title_section3).toUpperCase(l);
            }
            return null;
        }
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private static final String ARG_SECTION_NUMBER = "section_number";

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

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }
    }

}

Contact Activity
Code:
package com.gibb.picturekicker;

import java.util.ArrayList;
import java.util.List;

import android.support.v7.app.ActionBarActivity;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class ContactActivity extends ActionBarActivity {
    SimpleAdapter adpt;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);
        
        Button aktualisieren = (Button) findViewById(R.id.aktualisieren);
        aktualisieren.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                 (new SubConnectToDB()).execute();

            }
        });
        adpt  = new SimpleAdapter(new ArrayList<Contact>(), this);
        ListView lView = (ListView) findViewById(R.id.listView1);
         
        lView.setAdapter(adpt);
        
        // Exec async load task
        (new SubConnectToDB()).execute();
        
        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.contact, menu);
        return true;
    }

    @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);
    }
    
    
    private class SubConnectToDB extends AsyncTask<Void, Void, List<Contact>>{
        private final ProgressDialog dialog = new ProgressDialog(ContactActivity.this);
        
        @Override
        protected void onPreExecute() {       
            super.onPreExecute();
            dialog.setMessage("Kontake werden geladen...");
            dialog.show();           
        }

        @Override
        protected List<Contact> doInBackground(Void... params) {
            Context context = getApplicationContext();            
            TelephonyManager tMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            String ownNumber = tMgr.getLine1Number();
            ValueParser pars = new ValueParser();
            ownNumber = pars.parseOwnNumber(ownNumber);
            ArrayList<Contact> myArr = new ArrayList<Contact>();
            

            if(ownNumber != null) {
                Connection connect = new Connection();

                String phoneNumber = "";
                    
                Cursor cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
                while (cursor.moveToNext()) 
                {
                    phoneNumber = pars.getNumber(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                    
                    if (connect.existNumber(phoneNumber)) {
                        Contact contact = new Contact();
                        contact.setFirstName(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))); 
                        contact.setLastName(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)));
                        Log.d("OnClick: ", phoneNumber + " : " + contact.getFirstName());
                        contact.setPhoneNumber(phoneNumber);
                        myArr.add(contact);
                    }
                }        

                connect.saveContactsInDatabase(ownNumber, myArr);    
    
                  
                Log.d("OnClick: ", "Position: " + connect.existNumber("0552514699"));

                return connect.getContactListFromDatabase(ownNumber);
                
            } else {
                Toast toast = Toast.makeText(getApplicationContext(), "You haven't a number !", Toast.LENGTH_SHORT);
                toast.show();
            }
                
            return null;
        }

        @Override
        protected void onPostExecute(List<Contact> result) {
            super.onPostExecute(result);
            dialog.dismiss();
            adpt.setItemList(result);
            adpt.notifyDataSetChanged();           
        }
        
    }
}

Wie kann ich das ContactActivity als einzelnes Tab in der Tabbed Activity einsetzten?
 
Zuletzt bearbeitet:
nochmal ganz langsam....

Eine Activity kann keine andere Activity beherbergen es läuft immer nur eine Activity zur selben Zeit...ohne wenn und aber es gibt keine ausnahmen

wie auch immer eine activity kann mehrere frgmente beherbergen diese haben ihren eigenen lifecycle und man kann denen auch eine eigene viewhierarchie zu weisen sprich du kannst dort so viele views reinpacken iwe dir gefällt

damit agiert ein fragment als quasi-activity innerhalb der activity und läuft ebenfalls auf dem ui thread so wie die zeichenoperationen der meißten view(ausnahme surfaceview, eglsurfaceview, native views und surfaces)


ein fragment darf jedoch selbst keine activity beherbergen

aber seit 4.2 und mit suppert ab API11 drüfen diese wiederum fragments beherbergen....

was deine frage wohl beantworten sollte ob es möglich ist activities in fragmente zu platzieren:nein

Der ursprüngliche Beitrag von 12:29 Uhr wurde um 12:32 Uhr ergänzt:

AndrejEdd schrieb:
Wie kann ich das ContactActivity als einzelnes Tab in der Tabbed Activity einsetzten?

Als Activity gar nicht

als Fragment (schreibarbeit ist dann angesagt) schon
 
  • Danke
Reaktionen: missspelled
wie kann ich dann diese contactActivity zu einem Fragment convertieren bzw. meine logik welche ich jetzt habe in einem fragment platzieren damit das ganze funktioniert?
 
das ist dann deine aufgabe....dafür musst du dich mit fragmenten auskennen
welche methode wann aufgerufen wird

einfach dort deine logik rein und die contentview setzen ganz normal
 
alles klar, ich probiere es mal

danke euch !
 
Okay, vielleicht hatte ich auch was missverstanden, ich dachte dein Problem wäre, dass du nicht weißt wie du die Kommunikation innerhalb der Fragmente darstellen willst..
 

Ähnliche Themen

OnkelLon
Antworten
13
Aufrufe
1.970
OnkelLon
OnkelLon
D
Antworten
23
Aufrufe
2.485
Data2006
D
Zurück
Oben Unten