ustawianie tekstu na nowej aktywności wykrzacza apliakcję

0

Witam,
jestem początkującym w programowaniu aplikacji na androida i próbuję napisać aplikację która po naciśnięciu przycisku odpala drugie activity i w nim zmienia tekst w etykiecie. Jednak po naciśnięciu przycisku aplikacja się zamyka i pokazuje się komunikat " Niestety aplikacja została zatrzymana".
W main activity mam button, textview oraz edittext. Na drugiej aktywności mam tylko jeden textview.
Moja funkcja obsługi wciśnięcia przycisku:

public final static String WIADOMOSC_WYSYLANA = "com.example.mojaaplikacja";
 //Obsluga przycisku
    public void Wyslij(View view){
      //tworzenie intencji
Intent intencjaWyslania = new Intent(this, WyslijAktywnosc.class);
        EditText poleTekstowe = (EditText) findViewById(R.id.editText);
        String wiadomoscDoWyslania = poleTekstowe.getText().toString();
       intencjaWyslania.putExtra(WIADOMOSC_WYSYLANA, wiadomoscDoWyslania);
        startActivity(intencjaWyslania);
    }

kod OnCreate z drugiej aktywności

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

                 Intent intencjaOdebrania =getIntent();
                 String wiado = intencjaOdebrania.getStringExtra(MainActivity.WIADOMOSC_WYSYLANA);

                  TextView moj2 = (TextView) findViewById(R.id.My2tekster);
                  moj2.setText(wiado);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }

Próbowałem ustawiać po włączeniu aktywności sztywny tekst poprzez moj2.setText("test"); Jednak dalej to samo było. Jednak gdy za komentuję linię moj2.setText(wiado); to aplikacja się nie wykrzacza.
Jednak jak zmieniam w taki sposób zawartość textview na pierwszej aktywności po przyciśnięciu przycisku wszystko działa.

Używam Android Studio 0.4, jakieś pół roku temu jak używałem Android Studio 0.2 taki sposób działał bez problemu.

0

Metoda findViewById zwraca null jeżeli nie znajdzie widoku o podanym id. W Twoim kodzie nie znajduje co znaczy, że pole tekstowe o takim id nie istnieje. Jeżeli jest to pole tekstowe, które jest umieszczone w layoucie fragmentu PlaceholderFragment to jedyne co musisz zrobić to zmienić kod na taki:

               
                 if (savedInstanceState == null) {
                    getFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
                 }  

                  String message = getIntent().getStringExtra(MainActivity.WIADOMOSC_WYSYLANA);
                  TextView textView = (TextView) findViewById(R.id.My2tekster);
                  textView.setText(message);
0

Nie miałeś na myśli

if (savedInstanceState == null) {
                    getSupport FragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
                 }

A nie:

 if (savedInstanceState == null) {
                    getFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
                 }  

Jak wpisałem getFragmentManager() zamiast getSupport FragmentManager() to pokazuje mi bład:

error: no suitable method found for add(int,PlaceholderFragment)
method FragmentTransaction.add(int,Fragment,String) is not applicable
(actual and formal argument lists differ in length)
method FragmentTransaction.add(int,Fragment) is not applicable
(actual argument PlaceholderFragment cannot be converted to Fragment by method invocation conversion)
method FragmentTransaction.add(Fragment,String) is not applicable
(actual argument int cannot be converted to Fragment by method invocation conversion)

A jak wpiszę ten kod co podałeś i zmienię z getFragmentManager() na getSupportFragmentManager() to dalej po wciśnięciu przycisku wywala mi aplikacje.

0

Wrzuć paczkę z projektem to Ci pomogę w 30 sekund, inaczej do niczego nie dojdziemy.

0

Prosze o to paczka:
MyApplication3.zip

0
  1. OnClick w xmlu działa tylko dla aktywności, dla fragmentów trzeba to zrobić w kodzie za pomocą setOnClickListener. Alternatywa: http://jakewharton.github.io/butterknife/

2.Co trzeba zmienić żeby działało:


    Klasa MainActivity

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

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

            rootView.findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    wyslijTekst(v);
                }
            });

            return rootView;
        }

        public void wyslijTekst(View view) {
            // Kod wykonywany w odpowiedzi na kliknięcie przycisku
            Intent intencjaWyslij = new Intent(getActivity(), drugaAktywnosc.class);
            EditText poleTekstowe = (EditText) getView().findViewById(R.id.editText);
            String wiadomosc = poleTekstowe.getText().toString();
            intencjaWyslij.putExtra(WIADOMOSC_WYSLANA,wiadomosc);
            startActivity(intencjaWyslij);

        }


       Klasa drugaAktywnosc


public class drugaAktywnosc extends ActionBarActivity {

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

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.druga_aktywnosc, 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);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

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

        @Override
        public void onResume() {
            super.onResume();

            String message = getActivity().getIntent().getStringExtra(MainActivity.WIADOMOSC_WYSLANA);
            TextView textView = (TextView) getView().findViewById(R.id.my2tekster);
            textView.setText(message);
        }
    }

}

Wynika to z tego, że te aktywności są tylko kontenerami dla fragmentów (a one zawierają cały interfejs w sobie). Zawsze możesz wywalić te fragmenty i w metodzie setContentView ustawić to co jest w onCreateView we fragmentach (w tym przypadku obydwa fragmenty są w zasadzie bezużyteczne).

0

Wielkie dzięki za pomoc.
A mam jeszcze takie pytanie. Czy pisanie przy użyciu fragmentów jest wymagane bądź zalecane, że za jakiś czas będzie się tworzyć aplikacje więc lepiej je opanować? Czy może mogę np. wrócić do Android Studio 0.2 gdzie nie było fragmentów i cały interfejs był w plikach XML aktywności.

0

To o czym mówisz nie ma nic wspólnego z Android Studio. Po prostu nowsza wersja generuje taki szablon i tyle. Jak chcesz napisać aplikację, która ładnie wygląda to lepiej użyć fragmentów, wtedy możesz mieć kilka niezależnych od siebie "okien" otwartych naraz (przykładem jest aplikacja gmail jak tablet jest w trybie landscape).

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