0

この例を使用して実装したデュアルペインに問題があります: [http://developer.android.com/reference/android/app/Fragment.html][1]

フラグメント 1 のコードは次のとおりです。

import android.app.FragmentTransaction;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast;
import ch.gt.ContactCall.R;

public class SideMenuFragment extends ListFragment {

private int currPosition = -1;

private String[] menuItems = new String[]{
        "Contact List",
        "Call Log",
        "Messages",
        "SMS"};


@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("currChoice", currPosition);
}

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

    if(savedInstanceState != null){
        //Restore last state for checked position
        currPosition = savedInstanceState.getInt("currChoice", 0);
    }
}

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

    ActionMenuArrayAdapter adapter = new ActionMenuArrayAdapter(getActivity(), menuItems);
    setListAdapter(adapter);

}

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

}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    //TODO: récupérer les données de la vue cliquée
    Toast.makeText(
            getActivity(),
            getListView().getItemAtPosition(position).toString() + " position" + position,
            Toast.LENGTH_LONG).show();

    showItemDetails(position);
}

private void showItemDetails(final int index) {
    currPosition = index;

    //getListView().setItemChecked(index, true);
    DetailsFragment details = (DetailsFragment) getFragmentManager().findFragmentById(R.id.fragment2);

    if (details == null || details.getShownIndex() != index) {
        details = DetailsFragment.newInstance(index);

        // Execute a transaction, replacing any existing fragment
        // with this one inside the frame.
        FragmentTransaction ft = getFragmentManager().beginTransaction();

        ft.replace(R.id.fragment2, details);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.commit();

    }


}
}

フラグメント 2 の私のコード:

import android.app.ListFragment;
import android.media.AudioFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import ch.gt.ContactCall.R;
import ch.gt.network.*;

import java.net.SocketException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class DetailsFragment extends ListFragment {

    public int mIndex = -1;
    private UdpStreamManager gcUdpm;
    private TcpStreamManager gcTcpm;
//private boolean networkAvailable = false;

public static DetailsFragment newInstance(int index){
    DetailsFragment f = new DetailsFragment();
    f.mIndex = index;
    f.gcUdpm = new UdpStreamManager(8000, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
            1024);
    return f;
}

public int getShownIndex(){
    //return getArguments().getInt("index",0);
    return mIndex;
}

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

    ArrayList<HashMap<String, String>> listitem = new ArrayList<HashMap<String,String>>();

    //HashMap<String, String> map;

    switch (mIndex){
        //User clicked on Contact List
        case 0:
            setContactList(listitem);
            break;
        //User clicked on Call Log
        case 1:
            setCallLogs(listitem);
            break;
        //User clicked on Messages
        case 2:
            break;
        //User clicked on SMS
        case 3:
            break;
        default:
            setWelcomeDisplay();
            break;
    }

}

//Fills XML with contact list
private void setContactList(ArrayList<HashMap<String, String>> listitem) {

    HashMap<String, String> map;
    map = new HashMap<String, String>();
    map.put("name", "toto1");
    map.put("gcpaddress", "101");
    map.put("list_image", String.valueOf(R.drawable.gc_launcher));
    listitem.add(map);

    map = new HashMap<String, String>();
    map.put("name", "toto2");
    map.put("gcpaddress", "102");
    map.put("list_image", String.valueOf(R.drawable.gc_launcher));
    listitem.add(map);

    map = new HashMap<String, String>();
    map.put("name", "mir");
    map.put("gcpaddress", "103");
    map.put("list_image", String.valueOf(R.drawable.gc_launcher));
    listitem.add(map);

    map = new HashMap<String, String>();
    map.put("name", "CANCEL");
    map.put("gcpaddress", "");
    map.put("list_image", String.valueOf(R.drawable.gc_launcher));
    listitem.add(map);

    //SimpleAdapter pout mettre les items de listitem dans le xml contacts_display
    SimpleAdapter adaptItem = new SimpleAdapter(getActivity(), listitem, R.layout.row_layout_contactslist,
            new String[]{"img", "name", "gcpaddress"}, new int[]{R.id.list_image, R.id.name, R.id.gcpaddress});
    setListAdapter(adaptItem);

}

//Fills XML with last calls
private void setCallLogs(ArrayList<HashMap<String, String>> listitem) {

    HashMap<String, String> map;
    map = new HashMap<String, String>();
    map.put("name", "taratata");
    map.put("gcpaddress", "103");
    map.put("list_image", String.valueOf(R.drawable.gc_launcher));
    listitem.add(map);

    map = new HashMap<String, String>();
    map.put("name", "sangoku");
    map.put("gcpaddress", "106");
    map.put("list_image", String.valueOf(R.drawable.gc_launcher));
    listitem.add(map);

    map = new HashMap<String, String>();
    map.put("name", "vegeta");
    map.put("gcpaddress", "107");
    map.put("list_image", String.valueOf(R.drawable.gc_launcher));
    listitem.add(map);

    map = new HashMap<String, String>();
    map.put("name", "CANCEL");
    map.put("gcpaddress", "");
    map.put("list_image", String.valueOf(R.drawable.gc_launcher));
    listitem.add(map);

    //SimpleAdapter pout mettre les items de listitem dans le xml contacts_display
    SimpleAdapter adaptItem = new SimpleAdapter(getActivity(), listitem, R.layout.row_layout_contactslist,
            new String[]{"img", "name", "gcpaddress"}, new int[]{R.id.list_image, R.id.name, R.id.gcpaddress});
    setListAdapter(adaptItem);


}

private void setWelcomeDisplay(){

    String[] items = new String[]{""};
    WelcomeArrayAdapter welcomeAdapter = new WelcomeArrayAdapter(getActivity(), items);
    setListAdapter(welcomeAdapter);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    //Retrieve username and user address from listview
    Map<String, String> selection = (Map<String, String>) l.getItemAtPosition(position);
    String name = selection.get("name");

    if (name.equals("CANCEL")){
        gcUdpm.disable();
        return;
    }

    String gcpaddress = selection.get("gcpaddress");


    switch (mIndex){
        //User clicked on Contact List
        case 0:
            call();
            Toast.makeText(
                    getActivity(),
                    "name: "+name+" address: "+gcpaddress + " position: " + position,
                    Toast.LENGTH_LONG).show();
            break;
        //User clicked on Call Log
        case 1:

            break;
        //User clicked on Messages
        case 2:
            break;
        //User clicked on SMS
        case 3:
            break;
        default:
            break;
    }
}

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

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

 //Just a call test function
private void call(){
    try {
        gcUdpm.enable();
        Log.d("VR", "GcUsm enabled and socket created");
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    gcUdpm.startReceive();
    gcUdpm.startStreaming();
}

}

そしてホバー処理のための私のxml:

<?xml version="1.0" encoding="utf-8"?>
<!--Handles color change on button selection-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false" android:state_selected="true" android:drawable="@android:color/transparent" />
    <item android:state_selected="true" android:drawable="@android:color/transparent" />
    <item android:state_pressed="true" android:state_selected="false" android:drawable="@android:color/transparent" />
    <item android:state_selected="false" android:drawable="@color/selected" />
</selector>

リストビューの各項目で使用されます。

私が実装しているデュアルペインは異なります。テキストをロードしているのではなく、SimpleAdapter オブジェクトを使用してビューを更新している別のリストフラグメントを介して別のリストをロードしているためです。これは、アイテムを選択したときの最初のリストフラグメントの背景色のみに関係します.onListItemClickイベントで2番目のフラグメントを更新しなくても問題ありません.選択したアイテムは、他のアイテムが通常の背景を黒のままにしている場合、灰色のままです. 次に、他のリストフラグメントに詳細をロードするメソッドを呼び出すと (実際には、テキストだけではなくユーザーのリストがロードされます)、選択された項目の背景色が変わりますが、他のフラグメントがそのコンテンツを変更する前に数ミリ秒だけ変更されます. 何が起こっているのかよくわかりませんが、フラグメントを変更すると、アクティビティの全体像が更新されるような気がします。

だから私の質問は次のとおりです。私はこの動作について正しいですか、それを回避する方法はありますか?

返信ありがとうございます。

4

1 に答える 1

0

エレガントではありませんが、私はそのように処理しました: 実際、すべてが画面の更新ごとに作成しているアダプターから取得されるため、フラグメントのコールバック関数を実装して、選択した位置を親アクティビティに伝達する必要があります。次のクリックで新しく選択された位置を割り当てる前に、最後に選択されたアイテムを記憶して、実際の位置と最後の位置を取得します。カスタム ArrayAdapter に戻ると、オーバーライドされた getView メソッドで、コンストラクターで親コンテキストを取得し、そこからこの値を取得して、最後に関連するアイテムの背景色を変更するだけです (選択したアイテムを新しい色に変更し、最後に選択したアイテムを元の背景に。

そして、トニー・スタークが言うように、私は天才です. :P

于 2013-06-13T12:39:17.973 に答える