2013-03-16 23 views
5

मैं एंड्रॉइड प्रोग्रामिंग में शुरुआती स्तर पर हूं, इसलिए मुझे इसके लिए आपकी ईमानदारी से मदद की ज़रूरत है। कोई भी कृपया मेरी मदद करो।एंड्रॉइड में फ्रैगमेंट-फ्रैगमेंट संचार

मैं टुकड़े

का उपयोग कर एक रपट यूआई का निर्माण करने की कोशिश कर रहा हूँ

तो मेरे वास्तविक संदेह नहीं है ... मैं एक Fragment (माना Fragment ए) यह एक TextView और उस में Button और एक अन्य Fragment (माना Fragment बी है है)। इसमें TextView है। मुझे की TextView की सामग्री Fragment बीमें सामग्री दिखाने की आवश्यकता है, जब मैंने Button को FRAGMENT A. में दबाया तो मैंने कई तरीकों की कोशिश की, दुर्भाग्य से मुझे उचित आउटपुट नहीं मिला। मुझे यकीन है कि आप इसके बारे में लोगों को जानते हैं। क्रिप्या मेरि सहायता करे।

धन्यवाद

+0

आपको टेक्स्ट को मूल गतिविधि में संग्रहीत करना चाहिए और इसे लोड करते समय इसे FRAGMENT B पर पास करना चाहिए। – dmaxi

+0

@dmaxi लेकिन मुझे नहीं पता कि अभिभावक गतिविधि – sam

+0

में टेक्स्ट को कैसे स्टोर किया जाए, एक स्ट्रिंग प्रकार सदस्य चर बनाएँ और इसे SaveInstanceState() कॉलबैक में बंडल में सहेजना न भूलें। आपको गतिविधि और टुकड़े के जावाडोक को भी पढ़ना चाहिए। – dmaxi

उत्तर

14

यह सोचा था कि श्रोता किया जाना चाहिए ताकि टुकड़े अभी भी एक दूसरे पर निर्भर नहीं कर रहे हैं और एक या दो फलक मोड में इस्तेमाल किया जा सकता। गतिविधि दोनों टुकड़ों के श्रोताओं को संभालना चाहिए।

package com.example; 

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 

import com.example.fragment.FragmentA; 
import com.example.fragment.FragmentA.TextChangeListener; 
import com.example.fragment.FragmentB; 

public class ActivityAB extends FragmentActivity { 

    FragmentA fragmentA; 
    FragmentB fragmentB; 

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

     FragmentManager manager = getSupportFragmentManager(); 
     fragmentA = (FragmentA) manager.findFragmentById(R.id.fragmentA); 
     fragmentB = (FragmentB) manager.findFragmentById(R.id.fragmentB); 

     fragmentA.setTextChangeListener(new TextChangeListener() { 

      @Override 
      public void onTextChange(CharSequence newText) { 
       fragmentB.updateTextValue(newText); 
      } 
     }); 
    } 

} 

यहाँ टुकड़ा ए, पाठ परिवर्तन ईवेंट के लिए कस्टम श्रोता है कि:

यहाँ दो टुकड़े के साथ गतिविधि का एक उदाहरण है।

package com.example.fragment; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import com.example.R; 

public class FragmentB extends Fragment { 

    TextView textView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_b, container, false); 
     textView = (TextView) view.findViewById(R.id.textView1); 
     return view; 
    } 

    public void updateTextValue(CharSequence newText) { 
     textView.setText(newText); 
    } 
} 

ActivityAB एक्सएमएल लेआउट::

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:baselineAligned="false" 
    android:orientation="horizontal" > 

    <fragment 
     android:id="@+id/fragmentA" 
     android:name="com.example.fragment.FragmentA" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 

    <fragment 
     android:id="@+id/fragmentB" 
     android:name="com.example.fragment.FragmentB" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 

</LinearLayout> 

टुकड़ा एक XML लेआउट:

<?xml version="1.0" encoding="utf-8"?> 
<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="This is text" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

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

</LinearLayout> 

package com.example.fragment; 

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.TextView; 

import com.example.R; 

public class FragmentA extends Fragment { 

    TextChangeListener listener; 

    public interface TextChangeListener { 
     public void onTextChange(CharSequence newText); 
    } 

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

     Button btn = (Button) view.findViewById(R.id.button1); 
     final TextView textView = (TextView) view.findViewById(R.id.textView1); 

     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (null != listener) { 
        listener.onTextChange(textView.getText()); 
       } 

      } 
     }); 
     return view; 
    } 

    public void setTextChangeListener(TextChangeListener listener) { 
     this.listener = listener; 
    } 
} 

यहाँ टुकड़ा बी पाठ क्षेत्र अद्यतन करने के लिए सार्वजनिक विधि है कि टुकड़ा बी एक्सएमएल लेआउट:

<?xml version="1.0" encoding="utf-8"?> 
<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="(here will be text)" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

</LinearLayout> 
+0

हाय, आपके उत्तर के लिए धन्यवाद .. लेकिन यह मेरे लिए काम नहीं कर रहा है..और एक और बात मेरे पास दो अलग टुकड़े नहीं हैं गतिविधि ab में लेआउट (मेरे पास दो खंड वर्ग और संबंधित लेआउट xml फ़ाइल है) ... इसके बजाय मेरे पास केवल एक टुकड़ा लेआउट है और iam गतिशील रूप से सामग्री को बदल रहा है .. क्या आप कृपया मेरे लिए एक बार और कोशिश कर सकते हैं .. – sam

+0

बटन क्लिक के दौरान विधि 'onTextChange'' लागू की जाएगी। इसलिए खंड ए को प्रतिस्थापित करने के लिए इस कॉलबैक का उपयोग खंड बी के साथ करें और आपको प्राप्त पाठ को भी सेट करें, उदा। 'FragmentB.updateTextValue (newText); this.showFragmentB(); ' – andrew

+0

यह सलाह सामान्य मामले में लागू नहीं होती है। यदि आप उप-टुकड़ों का उपयोग कर रहे हैं तो क्या होगा? एक माता-पिता के टुकड़े और बच्चे के टुकड़े को एक-दूसरे के साथ संवाद करने की आवश्यकता हो सकती है, ऐसा करने के लिए ऐसी गतिविधि तक पहुंचने के बिना। कुछ मामलों में रूट गतिविधि पूरे एप्लिकेशन (यानी: एक टैब-आधारित एप्लिकेशन) रख सकती है। प्रत्येक एकल उप-घटक के बीच हर एक संचार को एक स्थान के माध्यम से मार्गित नहीं किया जाना चाहिए (एकल जिम्मेदारी विरोधी पैटर्न का प्रमुख उल्लंघन) – Marchy

0

दो टुकड़े के बीच संचार हमेशा आदेश टुकड़े के बीच एक ढीला संयोजन रखने के लिए उनके टुकड़ा गतिविधि के माध्यम से किया जाना चाहिए, तो आप एक और टुकड़ा बी आप श्रोता बना सकते हैं करने के लिए एक टुकड़ा एक से कुछ डेटा भेजने के लिए चाहते हैं, तो और इसे अपने टुकड़े की गतिविधि में और अंदरूनी टुकड़े से लागू करें। आप उस श्रोता का उपयोग करके ईवेंट को आग लगा सकते हैं और खंड को गतिविधि में भेज सकते हैं, इसलिए अब खंड गतिविधि में खंड बी का ऑब्जेक्ट होगा और इसलिए खंड की गतिविधि सीधे खंड की विधि को कॉल कर सकती है बी और खंड बी को डेटा भेजें ...

2

ऐसा लगता है जैसे कि अपने सेटअप की तरह कुछ हो सकता है - MainActivity डब्ल्यू/FragmentA [जोड़ा] और FragmentB [जोड़ा]। इस मामले के लिए, मैं मेनएक्टिविटी के माध्यम से दो टुकड़ों के बीच संदेशों/कार्यों को प्रतिनिधि दूंगा। संदेशों/कार्यों को संभालने के लिए मुख्य गतिविधि को अनुमति देने से फ्रैगमेंट्स के बीच एक और जटिल परिस्थिति में 'विशेष' ऑर्केस्ट्रेशंस की सुविधा मिलती है।उदाहरण के लिए:

public interface FragmentCommunicator 
{ 
    public void sendMessage (String broadcastMessage); 
    public void takeAction (String name, int action, Fragment frag); 
} 

public class MainActivity extends Activity implements FragmentCommunicator 
{ 
    Fragment fragA; 
    Fragment fragB; 
    ... 
    @Override 
    public void sendMessage (String msg) 
    { 
     if (msg.Contains("Send To fragA")) 
      fragA.receiveMsg(msg); 
     ... 
    } 
    @Override 
    public void takeAction (String name, int action, Fragment frag) 
    { 
    if (action == CLOSE) 
      removeFragment(name, frag); 
     ... 
    } 
} 

public class FragmentA extends Fragment 
{ 
    ... 
@Override 
public void onClick(View v) 
{ 
    FragmentCommunicator inter = (FragmentCommunicator) getActivity(); 
    inter.sendMessage("the txt/information/etc you want to send to fragB");  
} 
} 

public class FragmentB extends Fragment 
{ 
    ... 
    public void receiveMsg (String msg) 
    { 
     textView.setText(msg); 
    } 
} 

मैं FragmentA के प्रेषण हिस्से को पोस्ट करना भूल गया। उम्मीद है कि यह मदद करता है।

0

developer.android.com

एक टुकड़ा अपने गतिविधि करने के लिए बातचीत करने के लिए अनुमति देने के लिए, आपको टुकड़ा कक्षा में एक इंटरफेस को परिभाषित करने और गतिविधि के भीतर इसे लागू कर सकते हैं। फ्रैगमेंट के दौरान इंटरफ़ेस कार्यान्वयन को इसके एटैच() लाइफसाइकिल विधि पर कैप्चर करता है और फिर गतिविधि के साथ संवाद करने के लिए इंटरफ़ेस विधियों को कॉल कर सकता है।

उदाहरण: - http://wiki.workassis.com/android-fragment-communication/

रेफरी: - https://developer.android.com/training/basics/fragments/communicating.html

-1

इसकी वास्तव में बहुत आसान, बस इन चरणों का पालन करें:

  1. तो तुम दो टुकड़े ए और बी बनाया है, अब अपने दिमाग, यानी जावा क्लास फाइलें बनाएं। उन्हें JClass ए (टुकड़ा एक के लिए) और JClass बी (टुकड़ा बी के लिए) में आप Frag एक

2.You बटन मिला फोन, इसलिए JClass एक करने के लिए जाना है, और उस में स्ट्रिंग पाठ उपयोगकर्ता प्रकार प्राप्त करने देता है और बटन इस तरह दबाए गए ईवेंट: // बस ऑनक्रेट विधि को ओवरराइड करें।

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.<name of your fragment A.xml file>,container,false); 

    userInput = (EditText)view.findViewById(R.id.<Id that you gave to EditText field in which user enters text>); 

    Button myButton = (Button)view.findViewById(R.id.<id of your Button>); 
    myButton.setOnClickListener(
      new Button.OnClickListener(){ 
       public void onClick(View v){ 
        JClassB.setText(userInput.getText().toString());/*Replace JClassB with the java class of Fragment B*/ 

       } 
      } 
    ); 

    return view; 
} 
  1. और अंत में अपने JClass बी (टुकड़ा बी के लिए जावा फ़ाइल):

    सार्वजनिक वर्ग BottomSectionFrag फैली टुकड़ा {

    private static TextView userText; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        View view = inflater.inflate(R.layout.fragmentB, container, false); 
        userText = (TextView)view.findViewById(R.id.userText); 
        return view; 
    } 
    public static void setText(String text){ 
        userText .setText(text); 
    
    } 
    

    }

वोला !!

पीएस यह स्टैक ओवरफ्लो पर मेरी पहली पोस्ट है: डी

शांति आउट।

0

मुझे गतिविधि को खंड के बीच खंड के बीच मध्य व्यक्ति होने की इच्छा है। लेकिन मुझे लगता है कि दूसरी चीज event bus आर्किटेक्चर का उपयोग कर रही है जो decoupling भी प्रदान करता है।

संबंधित मुद्दे