Androidアプリ開発で、Fragment上のtextviewのテキストを更新する

こんにちは、コンちゃんこと佐々木です。

今、Androidアプリ開発中ですが、メモしたいことがあったのでメモするよ。

 

Android Studio (Beta) 0.8.9で開発中。
エミュレータはgenymotionの、Android4.2.2(Nexus7)。
activity_my.xmlとfragment_my.xmlがあって、activity_my.xmlに書いたtextViewはMyActivity.javaから操作(setText())できる。
でも、fragmentができてからは(Android4~だったかな?)、fragment_my.xmlにtextViewを乗せたいよねー。

 

●Fragment上にあるtextViewのテキストを更新する

最初は「Hello world !」だけど、あとでAPI投げて帰ってきたデータの一部を表示させたいなーって思っていました。

いつの間にかMyActivity.java最下部にpublic static class PlaceholderFragment extends Fragment {}があったので(ホントにいつの間にか)、そこにメソッドを追加。
onCreate()の中のif文もいつの間にかあった。

ソースコードは以下のとおり。

package conchan.akita.jp.(秘密☆);

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.LoaderManager;
import android.content.Loader;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class MyActivity extends Activity implements LoaderManager.LoaderCallbacks<Bundle>{

    private TextView tv=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
        tv = (TextView) findViewById(R.id.textview2);
        Log.v("onCreate","start!!");
        getLoaderManager().initLoader(0,null,this);
        Log.v("onCreate getLoader","END!!");

    }

    @Override
    protected void onResume() {略}

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {略}

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {略}

    @Override
    public Loader<Bundle> onCreateLoader(int i, Bundle bundle) {
        AsyncAPI asyncAPI = new AsyncAPI(this);
        return asyncAPI;
    }

    @Override
    public void onLoadFinished(Loader<Bundle> bundleLoader, Bundle bundle) {
        int smileLevel = bundle.getInt("smileLevel");
        Log.v("onLoadFinished", "smileLevel = " + smileLevel);
        // *****   changed by conchan_akita 2015.02.23   *****
        // for textview on activity_my.xml
        //tv.setText("笑顔度:" +Integer.toString(smileLevel));
        // for textview on fragment_my.xml
        FragmentManager fm = getFragmentManager();
        PlaceholderFragment t1 = (PlaceholderFragment) fm.findFragmentById(R.id.container);
        t1.SetNewText("aiu");
        // *****   changed by conchan_akita END.   *****

        Toast.makeText(this,"笑顔度:"+Integer.toString(smileLevel), Toast.LENGTH_LONG).show();
        /*setContentView(
                tv, new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT)
        );*/
    }

    @Override
    public void onLoaderReset(Loader<Bundle> bundleLoader) {

    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        View rootView;

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.fragment_my, container, false);
            return rootView;
        }
        // Added method SetNewText by conchan_akita 2015.02.23
        public void SetNewText(String text){
            TextView textView = (TextView) rootView.findViewById(R.id.textview2);
            textView.setText(text);
        }
    }
}

 

20,30,58行目は、activityにtextViewを乗せている場合。

fragmentにtextView(今回はxml上でtextview2と名づけてある)を乗せている場合は、PlaceholderFragmentクラスに、setTextするメソッドを追加する(92行-95行)。
※追加に対応するためにrootViewをデフォルトのローカルからグローバル変数にした

そして60行-62行を書く。
onLoadFinished()内に書いているのは、AsyncTaskLoaderをextendsしたAsyncAPI.javaでAPIを投げていて、その結果を受け取るため。
各自、setTextしたいタイミングに書きましょう。
61行目は27行目と同様、R.id.containerであって、R.id.textview2ではないぞ!

 

それでは失礼します。

 

– とても参考にしたサイト –

・http://sadtoy.blog.fc2.com/blog-entry-15.html
・http://stackoverflow.com/questions/24559124/android-set-text-of-textview-in-fragment-that-is-in-fragmentpageradapter

– 追加勉強用-

・http://nobuo-create.net/fragment/
・http://stackoverflow.com/questions/9245408/best-practice-for-instantiating-a-new-android-fragment

コメントを残す

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)