2017-02-02 5 views
0

В настоящее время я работаю в своем собственном проекте стоматологического приложения, я хотел бы спросить, как передать определенные данные из пользовательского диалога и показать или добавить его в целевой фрагмент ?Передача данных из диалога в фрагмент в android

Цените для любой помощи.

Это Выборочная Диалог Скриншот:

enter image description here

CustomDialog.java

package com.bloxofcode.multipletabs; 

import android.app.Activity; 
import android.app.Dialog; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.annotation.RequiresApi; 
import android.view.View; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.CompoundButton; 
import android.widget.EditText; 
import android.widget.Toast; 
import android.widget.ToggleButton; 
import com.bloxofcode.multipletabs.Tab1; 

public class CustomDialog extends Dialog implements 
     View.OnClickListener { 

    public Activity c; 
    public CustomDialog d; 
    public Button yes, no; 

    ToggleButton btnGenderMale,btnGenderFemale; 
    Button btnCancel, btnAccept; 
    EditText eText; 

    public CustomDialog(Activity a) { 
     super(a); 
     // TODO Auto-generated constructor stub 
     this.c = a; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      getWindow().setBackgroundDrawableResource(android.R.drawable.dialog_holo_light_frame); 
     } 
     else{ 
      getWindow().setBackgroundDrawableResource(android.R.drawable.alert_light_frame); 
     } 

     setContentView(R.layout.activity_dialog); 


     btnGenderFemale = (ToggleButton) findViewById(R.id.toggleButtonFemale); 
     btnGenderMale = (ToggleButton) findViewById(R.id.toggleButtonMale); 
     btnCancel = (Button) findViewById(R.id.btnCancel); 
     btnAccept = (Button) findViewById(R.id.btnAccept); 
     eText = (EditText) findViewById(R.id.editText); 

     btnGenderMale.setChecked(true); 

     btnGenderMale.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonMale, boolean b) { 
//      Toast.makeText(getApplicationContext(), 
//        String.valueOf(buttonMale.isChecked()), Toast.LENGTH_SHORT).show(); 
       if(buttonMale.isChecked()){ 
        btnGenderMale.setEnabled(false); 
        btnGenderFemale.setEnabled(true); 
        btnGenderFemale.setChecked(false); 
       }else{ 

       } 
      } 
     }); 

     btnGenderFemale.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonFemale, boolean b) { 
//      Toast.makeText(getApplicationContext(), 
//        String.valueOf(buttonFemale.isChecked()), Toast.LENGTH_SHORT).show(); 
       if(buttonFemale.isChecked()){ 
        btnGenderMale.setEnabled(true); 
        btnGenderFemale.setEnabled(false); 
        btnGenderMale.setChecked(false); 
       }else{ 

       } 
      } 
     }); 


     btnCancel.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       dismiss(); 
      } 
     }); 

     btnAccept.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(getContext(),"Sample",Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

    @Override 
    public void onClick(View v) { 
     dismiss(); 
    } 
} 

Как добиться этого результата:

enter image description here

Tab1.java

package com.bloxofcode.multipletabs; 

import android.content.ContentValues; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.annotation.RequiresApi; 
import android.support.v4.app.Fragment; 
import android.support.v4.widget.CursorAdapter; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageButton; 
import android.widget.ListView; 

import com.bloxofcode.multipletabs.database.DBOpenHelper; 
import com.bloxofcode.multipletabs.database.NotesProvider; 

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class Tab1 extends Fragment { 
    private ImageButton imgButton; 
    private CustomDialog customDialog; 
    View v; 
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     v =inflater.inflate(R.layout.tab_1,container,false); 

     imgButton = (ImageButton) v.findViewById(R.id.imageButton); 
     //Creating ImageButton 

     imgButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       // Toast.makeText(getActivity(),"Hello Image Button!",Toast.LENGTH_LONG).show(); 
       customDialog = new CustomDialog(getActivity()); 
       customDialog.show(); 
      } 
     }); 

     press(); 
     return v; 
    } 

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) 
    public void press() { 
     insertNote("Juan Dela Cruz"); 

     Cursor cursor = getActivity().getContentResolver().query(NotesProvider.CONTENT_URI, 
       DBOpenHelper.ALL_COLUMNS, null, null, null, null); 
     String[] from = {DBOpenHelper.NOTE_TEXT}; 
     int[] to = {android.R.id.text1}; 
     CursorAdapter cursorAdapter = new SimpleCursorAdapter(getActivity(), 
       android.R.layout.simple_list_item_1,cursor,from,to,0); 

     ListView list = (ListView) v.findViewById(android.R.id.list); 
     list.setAdapter(cursorAdapter); 
    } 

    private void insertNote(String noteText) { 
     ContentValues values = new ContentValues(); 
     values.put(DBOpenHelper.NOTE_TEXT,noteText); 
     Uri noteUri =getActivity().getContentResolver().insert(NotesProvider.CONTENT_URI,values); 

     Log.d("MainActivity","Inserted note " + noteUri.getLastPathSegment()); 
    } 


} 

ViewPagerAdapter.java

package com.bloxofcode.multipletabs; 


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


public class ViewPagerAdapter extends FragmentStatePagerAdapter{ 

    CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created 
    int NumbOfTabs; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created 


    // Build a Constructor and assign the passed Values to appropriate values in the class 
    public ViewPagerAdapter(FragmentManager fm,CharSequence mTitles[], int mNumbOfTabsumb) { 
     super(fm); 

     this.Titles = mTitles; 
     this.NumbOfTabs = mNumbOfTabsumb; 

    } 

    //This method return the fragment for the every position in the View Pager 
    @Override 
    public Fragment getItem(int position) { 

     if(position == 0) // if the position is 0 we are returning the First tab 
     { 
      Tab1 tab1 = new Tab1(); 
      return tab1; 
     } 
     else if(position == 1) 
     { 
      Tab2 tab2 = new Tab2(); 
      return tab2; 
     } 
     else    // As we are having 3 tabs if the position is now 0 it must be 1 so we are returning second tab 
     { 
      Tab3 tab3 = new Tab3(); 
      return tab3; 
     } 


    } 

    // This method return the titles for the Tabs in the Tab Strip 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return Titles[position]; 
    } 

    // This method return the Number of tabs for the tabs Strip 

    @Override 
    public int getCount() { 
     return NumbOfTabs; 
    } 
} 

TabsActivity.java

package com.bloxofcode.multipletabs; 

import android.os.Build; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 


public class TabsActivity extends AppCompatActivity { 

    // Declaring Your View and Variables 
    Toolbar toolbar; 
    ViewPager pager; 
    ViewPagerAdapter adapter; 
    SlidingTabLayout tabs; 
    CharSequence Titles[]={"Patient","Appointment","Backup"}; 
    int Numboftabs =3; 

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


     // Creating The Toolbar and setting it as the Toolbar for the activity 
     toolbar = (Toolbar) findViewById(R.id.tool_bar); 
     setSupportActionBar(toolbar); 
     // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs. 
     adapter = new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs); 
     // Assigning ViewPager View and setting the adapter 
     pager = (ViewPager) findViewById(R.id.pager); 
     pager.setAdapter(adapter); 

     // Assiging the Sliding Tab Layout View 
     tabs = (SlidingTabLayout) findViewById(R.id.tabs); 
     tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width 

     // Setting Custom Color for the Scroll bar indicator of the Tab View 
     tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() { 
      @Override 
      public int getIndicatorColor(int position) { 
       //return ContextCompat.getColor(TabsActivity.this,R.color.tabsScrollColor); 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        return getResources().getColor(R.color.tabsScrollColor,TabsActivity.this.getTheme()); 
       }else { 
        return getResources().getColor(R.color.tabsScrollColor); 
       } 
      } 
     }); 

     // Setting the ViewPager For the SlidingTabsLayout 
     tabs.setViewPager(pager); 

    } 

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

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 
+0

Был ли мой ответ полезным? – OBX

+0

привет сэр, я использовал интерфейс ... и еще не попробовал eventbus ... но попробую ... спасибо – iamcoder

+0

Хорошо, интерфейс тоже вариант. Отметьте мой ответ, если это будет менее полезно. – OBX

ответ

0

Вы можете выполнить это, используя Interface.

YourInterface.Java

public interface YourInterface{ 
    void yourMethod(int data); 
} 

Использование этого интерфейса в диалоговом классе:

public class CustomDialog extends Dialog implements 
    View.OnClickListener { 

    private YourInterface delegate; 

    .... 

    public CustomDialog(Activity a) { 
     super(a); 
     // TODO Auto-generated constructor stub 
     this.c = a; 
     delegate = (YourInterface) a; 
    } 

} 

В вашей деятельности, который содержит фрагмент реализации интерфейса:

public class YourActivity extends AppCompatActivity implements YourInterface { 

    .... 

    @Override 
    public void yourMethod(int data) { 
     fragment.receiverMethod(data); 
    } 

} 

Tab1.java

public class Tab1 extends Fragment { 

    public void receiverMethod(int data) { 
     // do what you want with received data 
    } 
} 

Теперь использовать это просто вызвать delegate.yourMethod(data) передать его фрагмент

+0

Привет, сэр. Я немного запутался в использовании интерфейса, мне нужно включить метод onAttach для этого? – iamcoder

+0

Привет! Да, вам нужно переопределить метод onAttach, потому что это самый простой (если не единственный) способ получить контекст/действие, которое может быть применено к вашему интерфейсу. – Marat

+0

Привет, сэр im kinda новичок здесь, соединяя все коды. Но im используя viewpageadapter в коде, я пытался создать интерфейс и реализовал его в моей TabsActivity, но всегда получаю сообщение об ошибке. – iamcoder

1

Если вы хотите, чтобы держать вещи слабосвязанные и структурированными, Прекрасным, а альтернативой является выбор EventBus. Чтобы увидеть использование, см. Это Answer.

0

Вы можете использовать широковещательный приемник в вашей onDismiss, как показано ниже в диалоговом

@Override 
    public void onDismiss(DialogInterface dialog) { 
     super.onDismiss(dialog); 
     if (onDismissListener != null) { 
      Intent intent = new Intent("DialogDismiss"); 
      LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent); 

      onDismissListener.onDismiss(dialog); 
     } 
    } 

и в вашем фрагменте вы можете получить трансляцию

// В вашем фрагменте сделать ниже

BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
     //Work Here 
     } 
    }; 

// In OnCreate

LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, 
       new IntentFilter("DialogDismiss")); 

// OnDestroy

LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mReceiver); 
0

Если вы получаете вид из customDialog вы можете просто получить доступ к полям обычно с view.findViewById() из вашего класса фрагмента.

0

Поместите свои данные в budle в качестве пары ключ-значение и установите в качестве аргумента фрагмент в качестве аргумента. fragment.setArgument (расслоение)

Чтобы получить пакет в Фрагмен, вызовите Bundle сверток = getArgument() и получить значения из пакета на основе ключа.

0

Вы можете вернуть строку, которая была введена в EditText путем создания сеттера и геттер в пределах вашего Диалога класса возвращать строку переменной (например, editTextString), который вы назначили бы значение при нажатии кнопки accept.

Добавьте методы получения и установки для Dialog класса

private void setEditTextString() { 
    editTextString = eText.getText().toString() 
} 

public String getEditTextString() { 
    return editTextString; 
} 

В вашей мыши слушателем для кнопки принимаю добавьте следующую строку кода:

setEditTextString(eText.getText().toString());

Тогда все, что вам нужно do, чтобы вернуть значение, введенное в поле editText в классе Fragment, должно было бы вызвать общедоступный метод в вашем классе Dialog, чтобы вернуть строку.

dialogClass.getEditTextValue()