[Android]

Ken Masters

Lt. Junior Grade
Registriert
Dez. 2006
Beiträge
334
Hallo an alle,

ich habe folgende problemstellung: programmiert habe ich eine simple app, welches eine musikdatei abspielt. die app greift auch auf die metadaten des songs und gibt den intepreter, songnamen, einen cover (falls vorhanden) und die songlänge zurück. man hat sozusagen nur einen layout, wo alles enthalten ist. nun möchte ich das gerne aufteilen in 2 layouts und zwischen den hin und her swipen können. zur besseren verständnis und übersicht hier ein foto. ganz links sieht man die app im ganzen. die sichtweise, also ein paar kompnenten würde ich gerne aufteilen so das 2 layouts hätte (rechte seite). und zwischen denen möchte ich hin und her swipen. anhand meine bisherigen rescherche habe ich herausgefunden, dass sich fragmente dazu am besten eignen. sicher bin ich mir aber nicht, da ich nur ziemlich simple beispiele mit fragments gefunden habe. das heißt, ich weiß grob wie man mehrere "activites" mit fragmenten darstellt, mehr aber auch nicht. also nur rein obersichtlich ohne funktionen. sobald ich methoden einfüge oder die buttons/imageviews die ID's zuweise, so dass z.b. auf knopfdruck der song abgespielt werden soll, dann bekomme ich nur fehlermeldungen.

hier ist mein bisheriger code:

Code:
public class MainActivity extends FragmentActivity {

SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(com.example.swipeview3.R.layout.main);

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

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

}

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

//  ------------------------------#########################------------------------------
//  ------------------------------#########################------------------------------

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {

        if(position == 0) {
            PlayerFragment f = new PlayerFragment(position);
            return f;
        }
        if(position == 1) {
            SongParameterFragment f = new SongParameterFragment(position);
            return f;
        }
        else {
            Fragment fragment = new DummySectionFragment();
            Bundle args = new Bundle();
            args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
            fragment.setArguments(args);
            return fragment;
        }
    }

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

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

//  ------------------------------#########################------------------------------
//  ------------------------------#########################------------------------------

public static class DummySectionFragment extends Fragment {

    public static final String ARG_SECTION_NUMBER = "section_number";

    public DummySectionFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Create a new TextView and set its text to the fragment's section
        // number argument value.
        TextView textView = new TextView(getActivity());
        textView.setGravity(Gravity.CENTER);
        textView.setText(Integer.toString(getArguments().getInt(
                ARG_SECTION_NUMBER)));
        return textView;
    }
}

//  ------------------------------#########################------------------------------
//  ------------------------------#########################------------------------------

public static class PlayerFragment extends Fragment {

    int fragmentNR;
    Button btnPlay, btnStop, btnExit;
    SeekBar seekBar;

    public PlayerFragment(int position) {
        this.fragmentNR = position;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        btnPlay = (Button)getView().findViewById(com.example.swipeview3.R.id.button_play);
        btnStop = (Button)getView().findViewById(com.example.swipeview3.R.id.button_stop);
        btnExit = (Button)getView().findViewById(com.example.swipeview3.R.id.button_exit);

        return inflater.inflate(com.example.swipeview3.R.layout.player, container, false);
    }



}

//  ------------------------------#########################------------------------------
//  ------------------------------#########################------------------------------

public static class SongParameterFragment extends Fragment {

    int fragmentNR;
    ImageView cover;
    TextView songParameter, songDuration;

    public SongParameterFragment(int position) {
        this.fragmentNR = position;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        return inflater.inflate(com.example.swipeview3.R.layout.song_parameters, container, false);
    }
}
}

ich bekomme ja schon fehlermeldungen wenn ich im PlayerFragment die buttons die id's zuweise (nullpointerException). ich weiß einfach nicht wo ich das sonst machen soll bzw. wo die methoden hingehören, also in welche klasse. ich bin etwas verwirrt mit dieser sache und bitte um hilfe und ratschläge wie ich da herangehen soll. funktioniert das mit fragmenten oder muß man da anders herangehen? :confused_alt: :rolleyes:
danke im voraus
 
Probier mal, die ganzen Views in den einzelnen Fragment Klassen jeweils in der onActivityCreated() zuzuweisen.
 
1. Du musst zuerst eine View im Fragment erstellen und DANN nach den IDs darin suchen:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(com.example.swipeview3.R.layout.player, container, false);
btnPlay = (Button)v.findViewById(com.example.swipeview3.R.id.button_play);
btnStop = (Buttonv.findViewById(com.example.swipeview3.R.id.button_stop);
btnExit = (Button)v.findViewById(com.example.swipeview3.R.id.button_exit);

return v;
}
Ergänzung ()

Und 2:
Nur den Default Parameter in Fragments verwenden. Sonst crashts beim oritentierungswechsel.
Stattdessen deinen Paramter (position) in ein arguments bundle packen und dann in onCreate im Fragment wieder rausholen:
Bundle args = New Bundle();
args.setInt("position", ...);
newFragment.setArguments(args);

fragmentNr = getArguments().getInt("position")
 
Zuletzt bearbeitet:
guten morgen und danke für eure mühen,

so hat es funktioniert

Code:
@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
			
			View v = inflater.inflate(com.example.swipeview3.R.layout.player, container, false);
			
			btnPlay = (Button)v.findViewById(com.example.swipeview3.R.id.button_play);
			btnStop = (Button)v.findViewById(com.example.swipeview3.R.id.button_stop);
			btnExit = (Button)v.findViewById(com.example.swipeview3.R.id.button_exit);
			
			return v;
		}

die funktionen bzw. methoden kommen in die mainactivity. hatte zuerst diese in den fragments eingebaut und bekam die fehlermeldung, das die methoden in der activity fehlen. so funzt nun alles. ich danke euch wirklich sehr. das sind zwar kleinigkeiten aber gerade diese kleinen sachen machen mich verrückt und halten mich lange hin. dankeee :cheerlead:
Ergänzung ()

Matthias247 schrieb:
1. Du musst zuerst eine View im Fragment erstellen und DANN nach den IDs darin suchen:
Ergänzung ()

Und 2:
Nur den Default Parameter in Fragments verwenden. Sonst crashts beim oritentierungswechsel.
Stattdessen deinen Paramter (position) in ein arguments bundle packen und dann in onCreate im Fragment wieder rausholen:
Bundle args = New Bundle();
args.setInt("position", ...);
newFragment.setArguments(args);

fragmentNr = getArguments().getInt("position")

danke für deine zweite ergänzung. das werde ich mit berücksichtigen ;)
Ergänzung ()

ach ja, eine frage habe ich noch: wenn ich in einem fragment auf play drücke und der song wird abgespielt, sollen die parameter wie songname,interpreter, cover etc. zu den textviews des anderen fragments zugewiesen werden. wie müsste dann diese in der mainactivity implementieren, wenn die in den fragmenten initialisiert werden!?
Ergänzung ()

könnte mir jmd sagen, wie mein ein interface instanziiert? ich möchte zwischen 2 fragmenten kommunizieren. was ich möchte ist nur, wenn ich den button aus fragment1 klicke soll ein text in fragment 2 erscheinen. aber bei meinen besherigen code passiert gar nicht, da fragmentCommunicator = null ist.

die interfaces:

Code:
public interface ActivityCommunicator {

public void passDataToActivity(String someValue);

}


public interface FragmentCommunicator {

public void passDataToFragment(String someValue);

}

die mainactivity:

Code:
public class MainActivity extends FragmentActivity implements ActivityCommunicator {

public FragmentCommunicator fragmentCommunicator;
SectionsPagerAdapter mSectionsPagerAdapter;
Button btn;
ViewPager mViewPager;

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

    btn = (Button)findViewById(R.id.button1);
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

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

public void SendText(View v) {

    if(fragmentCommunicator != null) {

        fragmentCommunicator.passDataToFragment("Hi from FragmentActivity");
    }
}

@Override
public void passDataToActivity(String someValue) {
    // TODO Auto-generated method stub
}
}

Fragemt1:
Code:
public class Fragment1 extends Fragment {

Button btn;

public Fragment1(int position) {
    // TODO Auto-generated constructor stub
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragmen1, container, false);
    btn = (Button)v.findViewById(R.id.button1);
    return v;
}
}

fragment2:
Code:
public class Fragment2 extends Fragment implements FragmentCommunicator {

TextView tv;
private ActivityCommunicator activityCommunicator;
private String activityAssignedValue ="";

public Fragment2(int position) {
    // TODO Auto-generated constructor stub
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment2, container, false);
    tv = (TextView)v.findViewById(R.id.textView1);
    return v;
}

@Override
public void passDataToFragment(String someValue) {
    activityAssignedValue = someValue;
    tv.setText(someValue); 
}
}

fragment1.xml:

Code:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="SendText"
    android:text="Button" />

</LinearLayout>

fragment2.xml

Code:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

main.xml:

Code:
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<!--
This title strip will display the currently visible page title, as well as the page
titles for adjacent pages.
-->

<android.support.v4.view.PagerTitleStrip
    android:id="@+id/pager_title_strip"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:background="#33b5e5"
    android:paddingBottom="4dp"
    android:paddingTop="4dp"
    android:textColor="#fff" />

</android.support.v4.view.ViewPager>

wäre echt super korrekt, wenn mir jmd. hilfen würde. danke im voraus
 
Zuletzt bearbeitet:
Zurück
Oben