从膨胀的布局中膨胀ListView / ExpandableListView

时间:2016-07-27 08:02:57

标签: android android-layout listview android-fragments expandablelistview

为了使它更简单,让我们说我有一个使用layoutinflater从布局中膨胀按钮的服务。这个膨胀的按钮显示在所有其他应用程序之上(使用 SYSTEM_ALERT_WINDOW 权限),如下所示:

button overlay

从主要活动开始服务的代码:

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Overlay"
        android:id="@+id/btn_start"
        android:layout_gravity="center_horizontal" />
</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Button btn_start;

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

        btn_start = (Button) findViewById(R.id.btn_start);

        btn_start.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                startService(new Intent(MainActivity.this, ButtonOverlay.class));
            }
        });
    }
}

服务代码:

ButtonOverlay.java

public class ButtonOverlay extends Service{

    private WindowManager wm;
    private LinearLayout ll;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

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

        wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        ll = new LinearLayout(this);

        LinearLayout.LayoutParams llParameters = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        ll.setBackgroundColor(Color.argb(50, 255, 255, 255));
        ll.setLayoutParams(llParameters);

        final WindowManager.LayoutParams parameters = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
        parameters.x = 0;
        parameters.y = 0;
        parameters.gravity = Gravity.LEFT | Gravity.TOP;

        LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        ll = (LinearLayout) li.inflate(R.layout.activity_button, null);

        Button btn = (Button) ll.findViewById(R.id.btn_click);
        wm.addView(ll, parameters);
    }
}

包含膨胀按钮的布局:

activity_button.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click"
        android:id="@+id/button_click"
        android:textColor="#ffffff" />
</LinearLayout>

现在我要做的是为按钮btn_click设置onClickListener,这样当你点击它时,另一个带有listView或更好的expandableListView的布局会膨胀。 这是我需要的纯文本视图:

floating window

但我不知道如何使用 listView expandableListView 进行操作,因为它们更复杂。
我是否正在以正确的方式创建这样的叠加层?
我应该如何构建我的代码以保持其清洁,多个覆盖按钮可以膨胀不同的布局(例如button1显示纯文本,如上图所示,button2显示列表视图,button3显示一个imageview)?

修改1:

我要this example查看expandableListView,并将其作为一个独立的项目工作没问题。我试图将这个确切的示例扩展为像plainTextView那样的浮动窗口jst,但我不知道应该将代码放在onCreate方法中的哪个位置。有什么想法吗?

0 个答案:

没有答案