3

これが私が書いた MainActivity のコードです。最初の画面でフラグメントのリストを読み込んでいます。ユーザーがリスト項目のいずれかをタップすると、別のクラスで定義した詳細フラグメントで惑星名がユーザーに表示されます。

「Fragment Planet List」→「Fragment Planet Detail」のトランザクションをバックスタックに追加しています。だから私が期待しているのは、惑星の詳細の断片から戻るボタンを押すと、電話に惑星のリストが読み込まれるはずです. しかし、それはこのようには起こっていません。

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.FrameLayout;

import com.meditab.fragments.fragment.FragmentPlanetDetail;
import com.meditab.fragments.fragment.FragmentPlanetList;

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


public class MainActivity extends ActionBarActivity implements Callback {

    private FrameLayout frmPlanetList;
    private FrameLayout frmPlanetDetail;
    private boolean isPhone;


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

        frmPlanetList = (FrameLayout) findViewById(R.id.frmPlanetList);
        frmPlanetDetail = (FrameLayout) findViewById(R.id.frmPlanetDetail);

        if (null != frmPlanetDetail) {
            isPhone = false;
        } else {
            isPhone = true;
        }

        FragmentManager fragmentManager = getFragmentManager();

        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        fragmentTransaction.replace(R.id.frmPlanetList, new FragmentPlanetList());

        fragmentTransaction.commit();

    }


    @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);
    }

    @Override
    public void onListItemClicked(int intPosition) {

        FragmentManager fragmentManager = getFragmentManager();

        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        List<String> lstPlanetArray = getPlanetArray();
        String strPlanetName = lstPlanetArray.get(intPosition);

        FragmentPlanetDetail fragmentPlanetDetail = FragmentPlanetDetail.newInstance(strPlanetName);
        if (isPhone) {
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.replace(R.id.frmPlanetList, fragmentPlanetDetail);
        } else {
            fragmentTransaction.replace(R.id.frmPlanetDetail, fragmentPlanetDetail);
        }

        fragmentTransaction.commit();

    }

    private List<String> getPlanetArray() {
        List<String> lstPlanets = new ArrayList<>(10);
        lstPlanets.add("Mercury");
        lstPlanets.add("Venus");
        lstPlanets.add("Earth");
        lstPlanets.add("Mars");
        lstPlanets.add("Jupiter");
        lstPlanets.add("Saturn");
        lstPlanets.add("Uranus");
        lstPlanets.add("Neptune");
        lstPlanets.add("Saturn");

        return lstPlanets;
    }

}

ただし、backPress メソッドをオーバーライドしてプログラムでバック スタックをポップすると、問題なく動作します。

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() != 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

この動作を実現したい場合、この方法で onBackPressed() メソッドをオーバーライドする必要がありますか? このリンクでこのメソッドをオーバーライドする必要があることは文書化されていません。Android Back Press フラグメント ドキュメント

Fragment Planet 詳細クラス

import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.meditab.fragments.R;

/**
 * Created by BHARGAV on 25-Dec-14.
 */
public class FragmentPlanetDetail extends Fragment {

    private String strPlanetName;

    public FragmentPlanetDetail() {

    }

    public static FragmentPlanetDetail newInstance(String strPlanetName) {
        FragmentPlanetDetail fragmentPlanetDetail = new FragmentPlanetDetail();

        Bundle bundle = new Bundle();
        bundle.putString("Planet_Name", strPlanetName);
        fragmentPlanetDetail.setArguments(bundle);
        return fragmentPlanetDetail;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle bundle = getArguments();
        if (null != bundle) {
            strPlanetName = bundle.getString("Planet_Name");
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.planet_name, container, false);

        TextView txtPlanetName = (TextView) rootView.findViewById(R.id.txtPlanetName);
        txtPlanetName.setText(strPlanetName);

        return rootView;
    }
}

フラグメント惑星リスト クラス:

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.meditab.fragments.Callback;
import com.meditab.fragments.R;

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

/**
 * Created by BHARGAV on 25-Dec-14.
 */
public class FragmentPlanetList extends Fragment {

    private ListView listView;
    private ArrayAdapter<String> stringArrayAdapter;

    private Callback callback;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.listview, container, false);

        listView = (ListView) rootView.findViewById(R.id.listView);
        stringArrayAdapter = new ArrayAdapter<>(getActivity(),
                android.R.layout.simple_list_item_1, getPlanetArray());
        listView.setAdapter(stringArrayAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                callback.onListItemClicked(position);
            }
        });
        return rootView;
    }



    @Override
    public void onAttach(Activity activity) {

        super.onAttach(activity);

        callback = (Callback) activity;
    }

    private List<String> getPlanetArray() {
        List<String> lstPlanets = new ArrayList<>(5);
        lstPlanets.add("Mercury");
        lstPlanets.add("Venus");
        lstPlanets.add("Earth");
        lstPlanets.add("Mars");
        lstPlanets.add("Jupiter");
        lstPlanets.add("Saturn");
        lstPlanets.add("Uranus");
        lstPlanets.add("Neptune");
        lstPlanets.add("Saturn");

        return lstPlanets;
    }

}

コールバック インターフェイス:

/**
 * Created by BHARGAV on 26-Dec-14.
 */
public interface Callback {

    public void onListItemClicked(int intPosition);
}

ありがとう。追加の詳細やコードが必要な場合はお知らせください。

4

5 に答える 5

6

Ok。したがって、動作しない理由は、ActionBarActivty と Activity クラスの違いの競合です。FragmentTransactiongetSupportFragmentManager( ) メソッドとgetFragmentManager()メソッドの違い。

アクションバー アクティビティ:

私は ActionBarActivity を使用していandroid.support.v7.app.ActionBarActivityました。これは、v7互換ライブラリを使用していたことを意味します

FragmentManager: Fragment Manager は互換ライブラリからのものではありませんでした。直接だった

import android.app.FragmentManager;
import android.app.FragmentTransaction;

MainActivity クラスでわかるように。

フラグメント: android.app.Fragment; 個別のフラグメント クラスにインポートされるクラスです。

そのため、ActionBarActivity から Activity クラスに変更すると、問題なく動作していました。FragmentManager、FragmentTransaction、および Fragment クラスをライブラリ クラスをサポートするように変更した場合も同様です。

そのため、何らかの変更を加えた後、正常に動作するようになりました。ありがとう。

于 2014-12-29T06:51:37.813 に答える
0

変だけど思う

addToBackStack(null)

問題です

で置き換えてみてください

addToBackStack("planetDetail");
于 2014-12-26T16:40:34.380 に答える
0

もちろん、onBackPressed()メソッドをオーバーライドする必要はありません。それはただのハックです。

あなたのこの状態はそれを台無しにしています。

if (isPhone) {
        fragmentTransaction.addToBackStack(null);

このステートメントを条件なしで一度使用して、機能するかどうかを確認してみませんか。そのままお休みいただけます。このステートメントを if 条件の外に移動するだけです。

于 2014-12-26T15:53:25.433 に答える
0

フラグメント アクティビティを拡張するアクションバー アクティビティを使用しています。ここで、完璧な動作を得るには、アクションバー アクティビティを操作するためのサポート フラグメントが必要です。

ここでは、通常のフラグメント (v4 フラグメントをサポートしていない) でアクションバー アクティビティを使用しており、それが問題の原因となっています。したがって、完璧な動作を得るには、フラグメントをサポートするフラグメントに変更すると、正常に動作するはずです。

うまくいかない場合はお知らせください。

于 2014-12-26T20:31:25.387 に答える
0

さて、私はあなたと同じ問題を抱えていました。私にとってはうまくいきましたが、あなたにとっても解決策は次のように変更することだと思います:

1. サポート ライブラリのフラグメントを使用したフラグメント:

import android.support.v4.app.Fragment;

  1. getFragmentManager() と getSupportFragmentManager() :
于 2014-12-27T18:30:19.490 に答える