0

ナビゲーション ドロワーと最終的にいくつかのスライド タブを使用するために、すべてのコードをアクティビティからフラグメントに変換しようとしています。

現在、リストを開いて表示する半作業ナビゲーションドロワーがあります。しかし、私はフラグメントを初めて使用し、ナビゲーションドロワーを閉じて何も選択しないたびに最初のフラグメントをリロードするように見えるため、混乱しています。

MainDrawer.java :

package com.beerportfolio.beerportfoliopro;

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

/**
 * Created by Mike on 1/3/14.
 */
public class MainDraw extends FragmentActivity {
    final String[] data ={"Statistics","two","three"};
    final String[] fragments ={
            "com.beerportfolio.beerportfoliopro.StatisticsPage",
            "com.beerportfolio.beerportfoliopro.FragmentTwo",
            "com.beerportfolio.beerportfoliopro.FragmentThree"};
    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);

        //todo: load statistics fragment

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActionBar().getThemedContext(), android.R.layout.simple_list_item_1, data);

        final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);


        final ListView navList = (ListView) findViewById(R.id.drawer);
        navList.setAdapter(adapter);

        navList.setOnItemClickListener(new AdapterView.OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){
                drawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener(){
                    @Override
                    public void onDrawerClosed(View drawerView){
                        super.onDrawerClosed(drawerView);
                        FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
                        tx.replace(R.id.main, Fragment.instantiate(MainDraw.this, fragments[pos]));
                        tx.commit();
                    }
                });
                drawer.closeDrawer(navList);
            }
        });

        FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
        tx.replace(R.id.main,Fragment.instantiate(MainDraw.this, fragments[0]));
        tx.commit();

    }


}

StatisticsPage.java :

package com.beerportfolio.beerportfoliopro;

import android.app.ActionBar;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

/**
 * Created by Mike on 1/3/14.
 */
public class StatisticsPage extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        String userName = prefs.getString("userName", null);
        String userID = prefs.getString("userID", null);
        String url = "http://www.beerportfolio.com/app_getStatistics.php?";
        String userURLComp = "u=" + userID;


        url = url + userURLComp ;

        Log.d("basicStats", url);


        new getBasicStats(getActivity()).execute(url);
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.statistics_pagelayout, container, false);

    }





}
4

1 に答える 1

0

問題は、DrawerListener が OnClickListener に設定されるべきではないときに設定されていることです。

@Override public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){
    drawer.setDrawerListener(
        new DrawerLayout.SimpleDrawerListener(){
            @Override public void onDrawerClosed(View drawerView){...}
        }
    );
 }

整数の範囲はpos、ドロワーが閉じるたびに onDrawerClose が値がpos変更されていないと見なすようなものです。アイテムがクリックされたことを確認する条件がないため、ドロワーが閉じるたびに同じ Fragment が再作成されます (別のアイテムをクリックしない限り)。

アイテムがクリックされたときにメンバーのブール値を true に設定し、メンバーの int をその位置に設定します。ブール値を使用して、アイテムのクリックと引き出しのクローズを区別します。

private boolean mNavItemClicked = false;
private int mNavPosition = 0;
...
@Override protected void onCreate(Bundle savedInstanceState) {
...
    navList.setOnItemClickListener(new ListView.OnItemClickListener {
        @Override public void onItemClick(AdapterView parent, View view, int position, long id) {
            mNavItemClicked = true;
            mNavPosition = position;
            drawerLayout.closeDrawer(navList);
        }
    });
    ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(...) {
        public void onDrawerClosed(View view) {
            if (mNavItemClicked) {
                getSupportFragmentManager().beginTransaction()
                    .replace(R.id.main, Fragment.instantiate(MainDraw.this
                             , fragments[mNavPosition])
                    .commit();

            }
            mNavItemClicked = false;
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);
}

ActionBarDrawerToggleを使用することにした場合は、その設計ガイドラインに従い、Activity コールバック メソッドonConfigurationChangedとを呼び出しますonOptionsItemSelected

于 2014-01-04T02:07:56.343 に答える