android 活动.添加内容视图(视图)==视图组.添加内容视图(视图)?

wwtsj6pe  于 2022-12-31  发布在  Android
关注(0)|答案(2)|浏览(146)

我有一个关于Android Activitys的问题:
“活动”具有方法addContentView(View),而“视图组”具有(类似?)addView(View)方法。
不幸的是,它没有记录来自addContentView的视图的放置位置。它是像LinearLayout一样只是将视图添加到底部,还是更像FrameLayout,将其视图添加到“顶部”?它是否依赖于setContentView设置的ViewGroup
如果我深入到源代码中,我会看到addContentView将调用Window的抽象方法addContentView。不幸的是,我看不到哪个类正在实现这个方法。那么Activitys addContentView的行为到底是什么呢?

e3bfsja2

e3bfsja21#

每个Activity的基本布局都是FrameLayout。这意味着您通常通过setContentView()设置的布局是此布局的子布局。addContentView()只添加另一个子布局,因此其行为类似于FrameLayout(这意味着它在现有元素之上添加新的UI元素)
您可以使用ANDROID_SDK\tools文件夹中名为hierachyviewer的工具来检查这一点。

  • 这是调用addContentView()之前的布局,我的Activity由默认的FrameLayout组成,包含一个LinearLayout和一个Button(我的布局)。这反映在这里的最下面一行,上面的其他元素是标题/状态栏。*

  • 通过addContentView()添加TextView后,它看起来如下所示。您可以看到基础FrameLayout获得了一个新的子级。*
lf3rwulv

lf3rwulv2#

public void addContentView(View view,
              LayoutParams params) {
  mActivity.addContentView(view, params);
}

//

public static void SetActivityRoot(Activity c) {
      View v = ((ViewGroup)c.findViewById(android.R.id.content)).getChildAt(0);
    
      ScrollView sv = new ScrollView(c);
      LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
          LayoutParams.MATCH_PARENT);
      sv.setLayoutParams(lp);
    
      ((ViewGroup) v.getParent()).removeAllViews();
    
      sv.addView((View) v);
      c.addContentView(sv, lp);
    }

//

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  LinearLayout mainLayout = 
    (LinearLayout)findViewById(R.id.mainlayout);
  
  //newButton added to the existing layout
  Button newButton = new Button(this);
  newButton.setText("Hello");
  mainLayout.addView(newButton);
  
  //anotherLayout and anotherButton added 
  //using addContentView()
  LinearLayout anotherLayout = new LinearLayout(this);
  LinearLayout.LayoutParams linearLayoutParams = 
    new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.WRAP_CONTENT,
      LinearLayout.LayoutParams.WRAP_CONTENT);
  
  Button anotherButton = new Button(this);
  anotherButton.setText("I'm another button");
  anotherLayout.addView(anotherButton);
  
  addContentView(anotherLayout, linearLayoutParams);
 }

}

相关问题