2012-09-14 80 views
3

我創建的兩個片段名稱分別是Frag_A和Frag_B。在Frag_A中,我在列表視圖中顯示所有數據。 並且還有更新按鈕。在Frag_B中有編輯文本和保存按鈕。 首先,當用戶從列表視圖中選擇一個項目,然後點擊upadate。當點擊更新時Frag_A被Frag_B替換,並在編輯文本中顯示從選定列表視圖中選擇的項目,並且用戶進行更改並保存。如何實現此演示? 在此先感謝。如何在android中將數據從一個片段傳遞給其他片段?

我DatabaseAdapter文件是DBAdapter.java文件

package com.dlcpl.insert_view; 

import java.util.ArrayList; 
import java.util.List; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DBAdapter { 

    public static final String KEY_TEXT="text"; 
    public static final String TAG="DBAdapter"; 

    public static final String DATABASE_NAME="taskmanager.db"; 
    public static final String DATABAS_TABLE="text_table"; 
    public static final int DATABASE_VERSION=1; 

    public static final String DATABASE_CREATE="create table "+DATABAS_TABLE+"("+KEY_TEXT+" varchar(500) not null);"; 
    public final Context context; 
    public DatabaseHelper DBHelper; 
    public SQLiteDatabase db; 

    public DBAdapter(Context ctx) 
    { 
     this.context=ctx; 
     DBHelper=new DatabaseHelper(context); 
    } 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     public DatabaseHelper(Context context) 
     { 
      super(context,DATABASE_NAME,null,DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
      try 
      { 
       db.execSQL(DATABASE_CREATE); 
      } 
      catch(SQLException e) 
      { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
     { 
      Log.w(TAG,"Upgrading database from version"+oldVersion+"to"+newVersion+",which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS text_table"); 
      onCreate(db); 
     } 
    } 

    //---opens the database--- 
    public DBAdapter open() throws SQLException 
    { 
     db=DBHelper.getWritableDatabase(); 
     return this; 
    } 

    //---close the database--- 
    public void close() 
    { 
     DBHelper.close(); 
    } 

    //---insert a text into the database--- 
    public long insertText(String text) 
    { 
     ContentValues initialValues=new ContentValues(); 
     initialValues.put(KEY_TEXT, text); 
     return db.insert(DATABAS_TABLE, null, initialValues); 
    } 

    //---delete a particular contact--- 
    public boolean deleteContact(String text) 
    { 
     return db.delete(DATABAS_TABLE, KEY_TEXT + "=" + text, null) > 0; 
    } 

    //---retrieves all the text 
    /*public Cursor getAlltext() 
    { 
     return db.query(DATABAS_TABLE, new String[] {KEY_TEXT}, null, null, null, null, null); 
    }*/ 

    public List<String[]> getAlltext() 
    { 

     List<String[]> list = new ArrayList<String[]>(); 
     Cursor cursor = db.query(DATABAS_TABLE, new String[] {KEY_TEXT}, null, null, null, null, null); 

     int x=0; 
     if (cursor.moveToFirst()) { 
      do { 
       String[] b1=new String[]{cursor.getString(0)}; 

       list.add(b1); 

       x=x+1; 
      } while (cursor.moveToNext()); 
     } 
     if (cursor != null && !cursor.isClosed()) { 
      cursor.close(); 
     } 
     cursor.close(); 

     return list; 
    } 

    //---retrieves a particular contact--- 
    public Cursor gettext(String string) throws SQLException 
    { 
     Cursor mCursor= db.query(true, DATABAS_TABLE, new String[] {KEY_TEXT}, KEY_TEXT + "=" + string, null, null, null, null, null);  

     if(mCursor !=null) 
     { 
      mCursor.moveToFirst(); 
     } 
     return mCursor; 
    } 

    //---updates a text_table--- 
    public boolean updateContact(String text) 
    { 
     ContentValues args=new ContentValues(); 
     args.put(KEY_TEXT, text); 
     return db.update(DATABAS_TABLE, args, KEY_TEXT + "=" + text, null) > 0; 
    } 

} 

我Frag_A文件是View_Data.java

package com.dlcpl.insert_view; 

import java.util.ArrayList; 
import java.util.List; 

import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.TextView; 
//import android.widget.Toast; 
import android.app.ListFragment; 
import android.graphics.Color; 
public class View_Data extends ListFragment 
{ 
    public static final String ROW_ID = "row_id"; 
    ListView listView; 
    TextView selection; 
    TextView label1; 
    public int idToModify; 
    List<String[]> list = new ArrayList<String[]>(); 
    List<String[]> names2 =null ; 
    String[] stg1; 
    EditText A_input; 
    @Override 
    public View onCreateView(LayoutInflater inflater, 
    ViewGroup container, Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.view_data, container, false); 
    } 

    @Override 
    public void onStart() 
    { 
     super.onStart(); 
    DBAdapter dbAdapter =new DBAdapter(getActivity()); 
     dbAdapter.open();  
     names2 = dbAdapter.getAlltext(); 
     stg1=new String[names2.size()]; 
     int x=0; 
      String stg; 

      for (String[] name : names2) { 
       stg = name[0]; 

       stg1[x]=stg; 
       x++; 
      } 
     setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, stg1)); 


     Button btnLoad = (Button) getActivity().findViewById(R.id.updata); 


      btnLoad.setOnClickListener(new View.OnClickListener() {    
       public void onClick(View v) { 

        android.app.FragmentManager fragmentManager = getFragmentManager();     
        android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();     
        Update_data updatedata = new Update_data(); 
         fragmentTransaction.replace(R.id.fragment,updatedata);       


         fragmentTransaction.commit();   
        }   
       }); 

     dbAdapter.close(); 

    } 
    public void onListItemClick(ListView parent, View v, int position, long id) 
     {  

      for(int a = 0; a < parent.getChildCount(); a++) 
      { 
       parent.getChildAt(a).setBackgroundColor(Color.WHITE); 

      } 
      TextView label1=(TextView)getActivity().findViewById(R.id.textdisplay); 
      v.setBackgroundColor(Color.LTGRAY); 
      label1.setText(stg1[position]); 
     } 
} 

和Frag_B文件Update_data.java

package com.dlcpl.insert_view; 

import android.app.Fragment; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
//import android.widget.ListView; 
import android.widget.TextView; 
//import android.support.v4.app.Fragment; 
import android.widget.Toast; 

public class Update_data extends Fragment 
{ 
    //String Text; 
    EditText A_input; 
    TextView label1; 


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

    @Override 
    public void onStart() 
    { 
     super.onStart(); 
     Button btnLoad = (Button) getActivity().findViewById(R.id.save_btn); 
     A_input = (EditText)getActivity().findViewById(R.id.udate_text); 

      btnLoad.setOnClickListener(new View.OnClickListener() {    
       DBAdapter Adapter =new DBAdapter(getActivity()); 

       public void onClick(View v) {         

        Adapter.open(); 
        Cursor c = Adapter.gettext("text"); 
         if (c.moveToFirst()) 
         { 
         DisplayContact(c); 
         } 
         else 
         { 
         Toast.makeText(getActivity(), "No contact found", Toast.LENGTH_LONG).show(); 

         } 
         Adapter.close(); 

        }   
       }); 


    } 
    public void DisplayContact(Cursor c) 
    { 
     A_input.setText(c.getString(0)); 

    } 

} 

和我的主要活動fil e是Home.java

package com.dlcpl.insert_view; 

import android.app.Activity; 
import android.os.Bundle; 
//import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 


public class Home extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home);   

    Button insertData = (Button) findViewById(R.id.button1); 
     insertData.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       Insert_Data insertdata = new Insert_Data();    
       android.app.FragmentManager fragmentManager = getFragmentManager();     
       android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();     
       fragmentTransaction.replace(R.id.fragment,insertdata);     
       fragmentTransaction.commit();    
      } 

     }); 

     Button viewData = (Button) findViewById(R.id.button2); 
     viewData.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       View_Data viewdata = new View_Data();    
       android.app.FragmentManager fragmentManager = getFragmentManager();     
       android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();     
       fragmentTransaction.replace(R.id.fragment,viewdata);     
       fragmentTransaction.commit();    
      } 

     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_home, menu); 
     return true; 
    } 
} 

回答

1

由於兩個片段共享相同的活動「Home」,因此可以使用它來共享這兩個片段之間的信息。 View_Data可致電:

((Home) getActivity()).shareData("example string"); 

這可能對應於首頁的方法shareData():

public void shareData(String string){ 
    android.app.FragmentManager fragmentManager = getFragmentManager();     
    Update_data fragment = (Update_data) fragmentManager.findFragmentByTag("your_tag"); 
    fragment.update(string); 
} 

你需要設置你的第二個片段的ID,這樣的片段管理器能夠找到該片段,並在你的第二個片段中創建公共方法「更新」。

編輯:要設置片段的標記,請更改片段添加代碼以包含標記「your_tag」。

View_Data viewdata = new View_Data();    
android.app.FragmentManager fragmentManager = getFragmentManager();     
android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();     
fragmentTransaction.replace(R.id.fragment,viewdata,"your_tag");     
fragmentTransaction.commit();    
+0

我想將列表視圖中的選定項從片段首先傳輸到其他片段,並設置爲編輯文本。請給我充分的例子和解釋。提前致謝。 –

+0

我修改了我的示例以反映從一個片段到另一個片段的共享字符串。 – Ljdawson

+0

我已經創建了動態片段。請告訴我如何爲此代碼設置Update_data片段的ID Update_data片段=(Update_data)fragmentManager.findFragmentById(id_of_fragment); –

0
  • 選項1:使用意向,可以setIntent()getIntet() puting所有你希望在你的意圖的數據,
  • 選項2:無論你的片段在相同的活動離開。你可以通過調用獲得活動引用()getActivity()

在這兩種情況下,你的數據將被存儲在活動水平,這是一件好事,因爲你的片段住在同一個活動,以便這兩個選項可以很好做的工作好。

0

可以使用setArgument和getArgument方法來傳遞數據

ft.replace(R.id.menuContent, Fragment.instantiate(getApplicationContext(), name, bundle)); 

可以通過getArguments在FragmentB類得到這個束()方法 其中名稱是例如類的名稱fragmentB.class.getName()

+0

請給我完整的例子或任何相關鏈接以上提到的代碼。非常感謝。 –

6

與捆綁嘗試,

我現在不記得的代碼,但是當我的一個朋友用他用綁定片段,我覺得他喜歡用一些調用方法的最後一個參數。

UPDATE:

發送:

Fragment fragment = new Fragment(); 
Bundle bundle = new Bundle(); 
bundle.putInt(key, value); 
fragment.setArguments(bundle); 

檢索:

Bundle bundle = this.getArguments(); 
int myInt = bundle.getInt(key, defaultValue); 

我發現上面的代碼在此鏈接:How to transfer some data to another Fragment?

+0

感謝它的工作。 –

相關問題