2014-09-03 5 views
0

Я уже краснею страницу android.developer о фрагментах, но мне нужно: Fragment_A имеет EditText и Fragment_B только кнопку. Когда я нажимаю кнопку, я хочу сделать Toast в данных EditText.Получить данные из Fragment_a для Fragment_b

Как я могу это сделать? Спасибо за помощь.

MainActivity:

package rs.sqllogin.androidloginsql; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends FragmentActivity implements OnClickListener { 

    EditText etUser, etPass; 
    Button btnLogin; 

    String username, password; 
    // creat httpclient as the form container 
    HttpClient httpclient; 
    // httpPost method 
    HttpPost httppost; 
    // create an array list for the input data to be sent 
    ArrayList<NameValuePair> nameValuePairs; 
    // create a httpResponse and HttpEntity 
    HttpResponse response; 
    HttpEntity entity; 

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

     initialise(); 

    } 

    private void initialise() { 
     etUser = (EditText) findViewById(R.id.etUser); 
     etPass = (EditText) findViewById(R.id.etPass); 
     btnLogin = (Button) findViewById(R.id.btnSubmit); 

     btnLogin.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 

     // Toast.makeText(getApplicationContext(), "Gomb le lett nyomva", 
     // Toast.LENGTH_LONG).show(); 
     if (etUser.getText().toString().equals("") 
       || etPass.getText().toString().equals("")) { 
      Toast.makeText(getApplicationContext(), "Enter some Data!", 
        Toast.LENGTH_LONG).show(); 
     } else { 

      new HttpAsyncTask().execute(); 

     } 

    } 

    public String POST() { 

     // Create a new deafult httpclient 
     httpclient = new DefaultHttpClient(); 

     // Create a new HTTP Post with URL 
     httppost = new HttpPost("http://10.0.2.2/checklogin.php"); 

     username = etUser.getText().toString(); 
     password = etPass.getText().toString(); 

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
     nameValuePairs.add(new BasicNameValuePair("username", username)); 
     nameValuePairs.add(new BasicNameValuePair("password", password)); 
     String str = ""; 

     try { 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      response = httpclient.execute(httppost); 
      str = convertInputStreamToString(response.getEntity().getContent()) 
        .toString(); 

     } catch (UnsupportedEncodingException e) { 

      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      Log.e("Catch1", "ClientProtocolE"); 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      Log.e("Catch2", "IllegalStatementE"); 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.e("Catch3", "IOExpection"); 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return str; 

    } 

    private static String convertInputStreamToString(InputStream inputStream) 
      throws IOException { 
     BufferedReader bufferedReader = new BufferedReader(
       new InputStreamReader(inputStream)); 
     String line = ""; 
     String result = ""; 
     while ((line = bufferedReader.readLine()) != null) 
      result += line; 

     inputStream.close(); 
     return result; 

    } 

    private class HttpAsyncTask extends AsyncTask<Void, Void, String> { 

     @Override 
     protected String doInBackground(Void... params) { 

      return POST(); 
     } 

     @Override 
     protected void onPostExecute(String result) { 

      super.onPostExecute(result); 

      if (result.toString().equals("true")) { 

       MyFragmentAdapter adapter = new MyFragmentAdapter(
         getSupportFragmentManager()); 
       ViewPager p = (ViewPager) findViewById(R.id.pager); 
       p.setAdapter(adapter); 
       p.setCurrentItem(MyFragmentAdapter.NUM_ITEMS - 2); 

      } else { 
       Toast.makeText(getApplicationContext(), 
         "Helytelen bejelentkezes!", Toast.LENGTH_LONG).show(); 
      } 
     } 

    } 

} 

onPostExecute hangling пользовательский интерфейс ..

MyFragmentAdapter.java:

package rs.sqllogin.androidloginsql; 

import java.util.ArrayList; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

public class MyFragmentAdapter extends FragmentPagerAdapter { 

    public static final int NUM_ITEMS = 2; 
    private ArrayList<Fragment> fragments; 

    public MyFragmentAdapter(FragmentManager fm) { 
     super(fm); 

     fragments = new ArrayList<Fragment>(); 
     fragments.add(new FragmentOne()); 
     fragments.add(new FragmentTwo()); 
    } 

    @Override 
    public Fragment getItem(int pos) { 

     return fragments.get(pos); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return NUM_ITEMS; 
    } 

} 

FragmentOne.java:

package rs.sqllogin.androidloginsql; 

import java.util.ArrayList; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

public class MyFragmentAdapter extends FragmentPagerAdapter { 

    public static final int NUM_ITEMS = 2; 
    private ArrayList<Fragment> fragments; 

    public MyFragmentAdapter(FragmentManager fm) { 
     super(fm); 

     fragments = new ArrayList<Fragment>(); 
     fragments.add(new FragmentOne()); 
     fragments.add(new FragmentTwo()); 
    } 

    @Override 
    public Fragment getItem(int pos) { 

     return fragments.get(pos); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return NUM_ITEMS; 
    } 

} 

Фрагмент Two.java:

package rs.sqllogin.androidloginsql; 

import android.annotation.SuppressLint; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.Toast; 


public class FragmentTwo extends Fragment implements OnClickListener{ 

    public static final String TAG = "FragmentTwo"; 



    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = View.inflate(getActivity(), R.layout.fragmenttwo, null); 
     Button btnSend = (Button) v.findViewById(R.id.btn1); 
     btnSend.setOnClickListener(this); 



     return v; 


    } 



    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 



} 

ответ

0

Для получения доступа ничего от одного фрагмента к другому, вы можете создать свой статический экземпляр, как ценам ниже

private static FragmentOne fragmentOne; 

    public static FragmentOne getInstance() { 
     if (fragmentOne == null) { 
      fragmentOne = new FragmentOne(); 
     } 
     return fragmentOne; 
    } 

//you have edit text 
public EditText myEditText; 

Теперь во втором фрагменте, вы можете получить доступ к нему подзаконными

FragmentOne.getInstance().myEditText 
+0

Использовал ваш код и получил исключение. Первая часть кода, который я использовал в FragmentOne.java, и в FragmentTwo.java, внутри onClick у меня возникла проблема, в этой строке «String data = FragmentOne.getInstance(). MyEditText.getText(). ToString() «Действительно ли это использовать? Sry для вопросов noob ... –

+0

какое исключение вы получили? –

+0

java.lang.NullPointerException –

0

Любые конкретные причины, по которым EditText и Button находятся в другом Fragments?

Я думаю, что это больше проблема дизайна, чем проблема с программированием.

Фрагмент должен содержать автономную часть пользовательского интерфейса (например, форму). Каждый фрагмент должен знать как можно меньше о другом фрагменте.

Если вам действительно нужно показать Toast при отправке, сделайте это в Activity. Добавить слушателя в Fragment_B:

public static interface FragmentBListener 
{ 
    void onSubmit(); 
{ 

В Fragment_B

private FragmentBListener mListener; 
@Override 
public void onAttach(Activity activity) 
{ 
    super.onAttach(activity) 
    try{ 
     mListener = (FragmentBListener) activity; 
    } 
    catch(ClassCastException e) 
    { 
     throw new IllegalArgumentException("Activity must iimplement FragmentBListener!"); 
    } 

} 

В FragmentA метод добавить

public String getSubmitedText() 
{ 
    return mEditTextInstance.getText().toString; 
} 

imlement ваш FragmentBListener в вашем Activity

@Override 
public void onSubmit() 
{ 

    String toastMessage = mFragmentA.getSubmitedText(); 
    //show Toast 
} 
+0

Я хотел бы использовать около 3-4 фрагментов, каждый фрагмент имеет некоторый EditText, а в последнем фрагменте я пошлю содержимое EditText с помощью Button. Вот почему я создал UI вот так. :) Ждём ваш код, спасибо за помощь! –