2015-05-10 142 views
0

默認情況下,我在創建家庭片段啓動時有一個導航抽屜。現在從我的主要活動中,我進入下一個活動,我執行一些操作並使用onActivityResult返回mainactivity。在片段中獲取活動結果

高興在這裏一切工作正常。這是我的問題。

我在我的HomeFragment中有一個listview,所以在onActivityResult中,我得到了在其他活動中執行的值。現在我如何將這些值傳遞給我的主頁片段。

這是我從mainactivity推出新的活動:

Intent i = new Intent(MainActivity.this, AddTask.class); 
startActivityForResult(i,1); 

現在在AddTask我做一些操作,併發送回主要活動如下所示:

Intent i = new Intent(AddTask.this,MainActivity.class); 
setResult(RESULT_OK, i); 
finish(); 

現在在我的MainActivity onActivityResult:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 1) { 
       if(resultCode == RESULT_OK){ 
        AddedTask = data.getStringExtra("NewTask"); 
        CategoryName= data.getStringExtra("CategoryItem"); 
        TaskTime=data.getStringExtra("TaskTime"); 

        SharedPreferences settings = getSharedPreferences("taskdetails", 
         Context.MODE_PRIVATE); 

        SharedPreferences.Editor editor = settings.edit(); 
        editor.putString("NewTask", AddedTask); 
        editor.putString("CategoryItem", CategoryName); 
        editor.putString("TaskTime", TaskTime); 
        editor.commit(); 

       } 
       if (resultCode == RESULT_CANCELED) { 
        //Write your code if there's no result 
       } 
      } 
    } 

現在我在我的HomeFragment中有一個listView,其中I需要更新這些值:

public class HomeFragment extends Fragment { 
    ListView lv; 
    static final String TAG ="HomeFragment"; 
    private AdapterListViewData adapterListViewData; 
    private ArrayList<DataShow> listData = new ArrayList<DataShow>(); 
    private ListView listViewData; 
    String CategoryName,TaskTime; 
    String AddedTask; 
    public HomeFragment(){} 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_home, container, false); 
     listViewData = (ListView)rootView.findViewById(R.id.listViewData); 

     SharedPreferences settings = this.getActivity().getSharedPreferences("taskdetails", 
       Context.MODE_PRIVATE); 
     AddedTask = settings.getString("NewTask",null); 
     CategoryName= settings.getString("CategoryItem",null); 
     TaskTime=settings.getString("TaskTime",null); 
     listData.add(new DataShow(AddedTask,CategoryName,TaskTime)); 
     adapterListViewData = new AdapterListViewData(getActivity().getBaseContext(),listData); 
     adapterListViewData.notifyDataSetChanged(); 
     return rootView; 
    } 



} 

我沒有收到任何錯誤,並且沒有顯示listview。請告訴我。

+0

@ downvoter護理的人發表意見 – coder

+0

我已經發布了2個回答。我認爲我使用newInstance()的最新版本足以滿足您的需求。 –

回答

0

問題是導航抽屜在mainactivity菜單不在homefragment。所以onActivityResult指向mainactivity而不是我的HomeFragment。將菜單更改爲HomeFragment後,解決了我的問題。

感謝所有誰幫我出:)

0

從我可以看到,你從來沒有設置你的適配器到你的listView。

所以,添加下面創建一個新的AdapterListViewData和做.notifyDataSetChanged()

listViewData.setAdapter(adapterListViewData); 
+0

問題是沒有設置適配器,但無法獲取添加到列表視圖的詳細信息。 – coder

0

有實現這一目標的不同方式之間。

我主要使用事件總線來進行碎片和活動之間的通信。 您可以使用這個強烈推薦的Square隊的Otto公交車。

http://square.github.io/otto/

您可以SubscribeFragment的事件。當您在ActivityProduce中得到結果併發送到您的Fragment時。

0

似乎有一個時間onCreateView()之間的HomeFragmentonActivityResult()在MainActivity問題。 Google建議使用Bundle作爲數據參數,接口用於Activity和Fragment(s)之間的通信。設置起來並不困難,並且在您的應用程序中用於其他目的是很好的知識。

無論如何,我已經發布了一個答案,詳細解釋@Passing data between fragments contained in an activity(搜索我的用戶名,如果沒有立即發現)。 我喜歡展示一個片段,將數據發送到一個片段,從谷歌網頁@Communicating with Other Fragments的樣本:

// Create fragment and give it an argument for the selected article 
ArticleFragment newFragment = new ArticleFragment(); 
Bundle args = new Bundle(); 
args.putInt(ArticleFragment.ARG_POSITION, position); 
newFragment.setArguments(args); 
0

我只是想到了另外一個,可能是更好的,更方便的答案。由於您取決於onCreateView()HomeFragment,您可以通過newInstance()傳遞數據。 Google網頁@Fragment。搜索「靜態MyFragment newInstance」文本就是一個很好的例子。對於活動,搜索「Fragment newFragment = MyFragment.newInstance(」From Arguments「)」的文本。代碼片段在該網頁爲您HomeFragment:

public static class MyFragment extends Fragment { 
    CharSequence mLabel; 

    /** 
    * Create a new instance of MyFragment that will be initialized 
    * with the given arguments. 
    */ 
    static MyFragment newInstance(CharSequence label) { 
     MyFragment f = new MyFragment(); 
     Bundle b = new Bundle(); 
     b.putCharSequence("label", label); 
     f.setArguments(b); 
     return f; 
    } 

對於活動:

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

    if (savedInstanceState == null) { 
     // First-time init; create fragment to embed in activity. 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     Fragment newFragment = MyFragment.newInstance("From Arguments"); 
     ft.add(R.id.created, newFragment); 
     ft.commit(); 
    } 
} 

我相信你可以很容易地替換代碼自己。你的代碼顯示出對Android的很好的理解。 祝你好運,玩得開心,保持我們的發佈...

相關問題