抽屉菜单视图需要2次点击

时间:2014-11-26 12:42:39

标签: android

带有示例的回购:https://bitbucket.org/troffel/drawer-button-error

我遇到了一个我无法解决的问题。从一个更大的项目中我可以将它推导成一个较小的虚拟项目。

问题: 应用程序启动时,抽屉菜单中的按钮可正常工作。但是,在改变方向一次或多次后,按钮突然需要两次按键。

当注销事件时,它会显示连接到单击视图的eventlistener被触发,但是在第一次点击时似乎没有任何事情发生。

我将主要文件添加到帖子中,因此您可以在感兴趣时复制它。

非常感谢任何帮助。

主要布局:                   

    </LinearLayout>

    <LinearLayout
        android:id="@+id/left_drawer"
        android:orientation="vertical"
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@android:color/background_light">

    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

初始片段的布局(category_fragment):          

    <ListView
        android:id="@+id/left_drawer_listview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:choiceMode="singleChoice"/>
    <View
        android:layout_height="1dp"
        android:layout_width="match_parent"
        android:background="#ecebec"/>

    <TextView
        android:id="@+id/drawer_settings"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textColor="@android:color/black"
        android:textSize="20sp"
        android:clickable="true"
        android:onClick="openSettings"
        android:gravity="center_vertical"
        android:text="Settings"
        android:paddingLeft="10sp"/>  

</LinearLayout>

替换初始(preffragment)的片段:          

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:id="@+id/settings_checkbox_container"
        android:layout_weight="1">

    </LinearLayout>

    <Button 
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:id="@+id/settings_back"
        android:text="Save"
        android:layout_weight="1"/>

</LinearLayout>

Mainactivity:     package com.example.testdrawer;

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;

public class MainActivity extends ActionBarActivity {


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

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        fragmentTransaction.add(R.id.left_drawer, new CategoryFragment());
        fragmentTransaction.commit();
    }

    public void openSettings(View v){
        FragmentManager fmanager = getSupportFragmentManager();
        FragmentTransaction ftrans = fmanager.beginTransaction();
        PrefFragment prefFragment = new PrefFragment();
        ftrans.replace(R.id.left_drawer, prefFragment);
        ftrans.commit();
        Log.i("test", "Opening settings");
    }
}

categoryfragment代码:     package com.example.testdrawer;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class CategoryFragment extends Fragment{


    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View v = inflater.inflate(R.layout.category_fragment, container, false);
        //drawer menu
        return v;
    }
}

Preffragment.java:     package com.example.testdrawer;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;


public class PrefFragment extends Fragment{

    private Context context;
    private View checkbox_container;
    private Button settingsBack;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getActivity().getApplicationContext();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.preffragment, container, false);
        checkbox_container = v;
        settingsBack = (Button) v.findViewById(R.id.settings_back);
        settingsBack.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                saveSettings();
            }
        });

        //setupSimplePreferencesScreen();

        return v;

    }

    public void saveSettings(){
        //setSettings(checkbox_container);

        FragmentManager fmanager = getFragmentManager();
        FragmentTransaction ftrans = fmanager.beginTransaction();
        ftrans.replace(R.id.left_drawer, new CategoryFragment());
        ftrans.commit();

        Log.i("test", "saving settings");
    }
}

1 个答案:

答案 0 :(得分:0)

OK!这太奇怪了,但我发现了问题。

在我的问题中使用replace(容器,片段)代替add(容器,片段)解决了这个问题。

问题是我在我的活动onCreate方法中调用了add(容器,片段)。这意味着当发生方向更改时,它会在已存在的方向上调用add(容器,片段)。

replace(container,fragment)有效,因为它在逻辑上取代了现有的。

包含使用add(容器,片段)的解决方案是在我的活动onDestroy方法中删除(片段),从而避免可绘制。

希望能节省一些时间!