7

私はAndroid開発の初心者で、現在、タブホストとTabActivityを使用してさまざまなアクティビティを切り替えるアプリケーションを作成していました。このアプリケーションは正常に動作していましたが、最近、TabActivity が非推奨になっていることがわかりました。代わりにフラグメントを使用する必要があります。

だから、私はその方法を説明するこの素晴らしいチュートリアルに従います: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

そのほとんどは正常に動作しますが、現在フラグメントになっている古いアクティビティの一部が、この種のメソッドを使用して ImageButton を膨らませていたという問題があります。

private void displayLevelButtons() {
     LayoutInflater lf = getLayoutInflater();            
        btns = lf.inflate(R.layout.mallmapactivity_level_buttons, null, false);

        mBtnLevelDown = (ImageButton) btns.findViewById(R.id.btn_level_down);
        mBtnLevelUp = (ImageButton) btns.findViewById(R.id.btn_level_up);

        mBtnLevelDown.setOnClickListener(new OnClickListener() {
          @Override
           public void onClick(View view) {                  
              levelDown();
              updateLevelButtons();
           }
       });
       mBtnLevelUp.setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View view) {
              levelUp();
              updateLevelButtons();
           }
       });

       LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
       params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL | Gravity.RIGHT;            
       addContentView(btns,params);

    }

このメソッドをフラグメント内でコンパイルできるようにするために、次のように変更しました。

LayoutInflater lf = getLayoutInflater(); 

LayoutInflater lf = getActivity().getLayoutInflater();

addContentView(btns,params);

getActivity().addContentView(btns,params);

しかし、私のメソッド displayLevelButtons() をこのように使用すると、私のボタンは私のフラグメントの右下ではなく、私の一般的なビューの右下に表示されます

また、レイアウトを画像ボタンで膨らませるときにルートを指定しようとしました。すべてのフラグメント クラスは次のようになります。

public class MyFragment extends Fragment {

    private View btns;        
    private ImageButton mBtnLevelUp;
    private ImageButton mBtnLevelDown; 
    private ViewGroup myViewGroup;

@Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        myViewGroup = container;
        v = inflater.inflate(R.layout.mallmaptile, container, false);           
        return v;
    }

 @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        //Do some stuff and then :
            displayLevelButtons();        

    }

 private void displayLevelButtons() {
         LayoutInflater lf = getActivity().getLayoutInflater();          
         btns = lf.inflate(R.layout.mallmapactivity_level_buttons, myViewGroup, false);

         mBtnLevelDown = (ImageButton) btns.findViewById(R.id.btn_level_down);
         mBtnLevelUp = (ImageButton) btns.findViewById(R.id.btn_level_up);

         mBtnLevelDown.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {                     
              levelDown();
              updateLevelButtons();
            }
        });
        mBtnLevelUp.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
              levelUp();
              updateLevelButtons();
            }
        });

        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL | Gravity.RIGHT;            
        getActivity().addContentView(btns,params);

    }

そうすることで、ボタンはフラグメントの下部ではなく、一般的なビューの下部に表示されたままになり、 attachToRoot ブール値を true に変更しようとすると:

btns = lf.inflate(R.layout.mallmapactivity_level_buttons, myViewGroup, true);

次のエラーが表示されます: java.lang.IllegalStateException: 指定された子には既に親があります。最初に子の親で removeView() を呼び出す必要があります。

私は確かに、私は何か重要なことを逃しましたが、私は何も知りません。任意の提案をいただければ幸いです。

前もって感謝します、

4

2 に答える 2

12

レイアウトの膨張で問題に直面している場合は、次のコードを使用できます。

View headerView = View.inflate(this, R.layout.layout_name, null);

これにより、完全な親レイアウトが得られ、そのレイアウトを使用して必要なビューを取得したり、レイアウト パラメータを取得してレイアウト パラメータを任意のビューに設定したりできます (あなたの場合はボタンだと思います)。

于 2012-04-20T04:23:20.007 に答える
0

私は同じ問題を抱えていて、このリンクで私の答えを見つけました: インフレータの問題

あなたは依存なしでそれを行うことができます

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.view_with_merge_tag, this);
于 2016-12-19T08:34:57.007 に答える